Определите максимальную длину столбца для каждого столбца в упрощенном 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 
  • Как перенаправить вывод команды в файл?
  • Ошибка команды Bash
  • Баш для пользователя. Лучший в том же или отдельном скрипте?
  • Как создать сценарий переключения вывода xrandr?
  • Запуск сценария Python из любого места
  • Применить фильтр к значению переменной с использованием обратных ссылок
  • Автоматическое ведение журнала скриптов, выполняемых пользователями
  • Выполнить команду перед выключением
  • Как заменить пробелы во всех именах файлов с помощью подчеркивания в Linux с помощью сценария оболочки?
  • Bash Mysql Command Замена Login Failure
  • Как переносить переменные из другого Makefile в сценарий оболочки
  • Interesting Posts

    ls -a не показывает папку «system», но echo * показывает ее

    Как найти все и любые файлы «C», которые находятся в архиве Debian (либо в исходном, либо в двоичном виде)

    Понимание использования Inode NTFS-3g

    DROP все для порта 22, если не geoip набор из США для iptables и xtables

    И apt, и yum попытаются установить обновление ядра, когда не хватает места, и не удастся, оставив последнее ядро ​​недоступным

    Как печатать несколько страниц с каждой страницы с одной (правой) страницей?

    Есть ли способ сохранить изменения в разных языках в Debian

    Разница между cat и '>', чтобы обнулить файл

    Centos 7 больше не загружается

    Linux и Windows совместимый домашний привод

    Мой рукописный C + + Makefile дает команду не найдена

    Почему сочетания клавиш не работают, когда активировано подменю?

    s3cmd: как использовать exclude-from с файлом списка исключенных каталогов

    Как вызвать скрипт KSH из другого скрипта KSH

    Идиоматический метод bash для запуска необязательного действия без побочных эффектов на код выхода

    Linux и Unix - лучшая ОС в мире.