Определите максимальную длину столбца для каждого столбца в упрощенном csv-файле (по одной строке в строке)

Чтобы определить максимальную длину каждого столбца в csv-файле, разделенном запятыми, я взломал скрипт bash. Когда я запускал его в Linux-системе, он выдавал правильный вывод, но мне нужно, чтобы он работал в OS X, и он полагался на GNU-версию wc которая может использоваться с параметром -L для --max-line-length .

Версия wc на OSX не поддерживает эту конкретную опцию, и я ищу альтернативу.

Мой скрипт (который не так уж хорош – он отражает мои плохие навыки написания скриптов, которые я предполагаю):

 #!/bin/bash for((i=1;i< `head -1 $1|awk '{print NF}' FS=,`+1 ;i++)); do echo | xargs echo -n "Column$i: " && cut -d, -f $i $1 |wc -L ; done 

Какие принты:

 Column1: 6 Column2: 7 Column3: 4 Column4: 4 Column5: 3 

Для моего тестового файла:

 123,eeeee,2323,tyty,3 154523,eegfeee,23,yty,343 

Я знаю, что установка GNU CoreUtils через Homebrew может быть решением, но это не тот путь, который я хочу принять, поскольку я уверен, что его можно решить без изменения системы.

3 Solutions collect form web for “Определите максимальную длину столбца для каждого столбца в упрощенном csv-файле (по одной строке в строке)”

почему бы не использовать awk?

У меня нет теста для проверки Mac, но length () – довольно стандартная функция в awk, поэтому это должно работать.

Файл awk:

  { for (i=1;i<=NF;i++) { l=length($i) ; if ( l > linesize[i] ) linesize[i]=l ; } } END { for (l in linesize) printf "Columen%d: %d\n",l,linesize[l] ; } 

затем выполните

 mybox$ awk -F, -f test.awk a.txt Columen4: 4 Columen5: 3 Columen1: 6 Columen2: 7 Columen3: 4 

Подобно архемарам, но уменьшенным

 awk -F, ' { for (i=1;i<=NF;i++)l[i]=((x=length($i))>l[i]?x:l[i])} END {for (i in l) print "Column"i":",l[i]}' file Column4: 4 Column5: 3 Column1: 6 Column2: 7 Column3: 4 

Также для поддержания порядка

  awk -F, ' { for (i=1;i<=NF;i++)l[i]=((x=length($i))>l[i]?x:l[i])} END {for(i=1;i<=NF;i++) print "Column"i":",l[i]}' Column1: 6 Column2: 7 Column3: 4 Column4: 4 Column5: 3 

Решение perl :

 $ perl -F, -anle 'map {$h{$_} = length($F[$_]) if length($F[$_]) > $h{$_}} 0..$#F; END { print "Column @{[$_+1]}: $h{$_}" for sort {$a <=> $b} keys %h }' file Column 1: 6 Column 2: 7 Column 3: 4 Column 4: 4 Column 5: 3 
  • Возврат только содержимого до и после номера строки с разными совпадающими словами
  • Shell Script: захватывать строку в середине текста, иногда в начале
  • Исходное синтаксическое объяснение переменных в bashrc
  • Помощь при проверке выполнения предыдущей команды
  • Как я могу передать позиционный параметр, сценарий bash требует, чтобы он был недоступен?
  • Команда для перечисления всех имен пользователей на сервере Linux
  • .profile написан в сценарии оболочки - могу ли я вместо этого заставить мою систему понять, что я хочу, чтобы вместо этого выполнялся скрипт Python?
  • bash escape восклицательный знак внутри переменной с backtick
  • Отладка с помощью программирования оболочки и файлов cpp?
  • Сценарий с ошибкой «команда не найдена: ^ M»
  • Как выполнить команду find с помощью набора строк из строки в текстовом файле
  • Linux и Unix - лучшая ОС в мире.