2016-02-14 1 views
0

У меня есть несколько CSV-файлов с несколькими столбцами, и я хочу получить максимальную длину, минимальную длину отдельных столбцов и diff (max -min) для каждого столбец в том же файле CSV. Пример:Поиск минимальной и максимальной длины столбцов в CSV-файле с использованием сценария оболочки

файла:

abc 1234 4 
bcd 23644 534 
c 3232 6 

Ожидаемые результаты:

abc 1234 4 
    bcd 23644 534 
    c 3232 6 

Max Length 3 5 3 
Min Length 1 4 1 
Diff 2 1 2 

Следующий сценарий для вычисления длины столбца MAX производит ожидаемый результат:

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]} ' 

но есть проблема с MIN Длина сценария:

awk -F"," 'BEGIN { 
    for (i=1;i<=NF;i++) { 
     cur = length($i) 
     if ((min == 0) || (cur < min)) { 
      minlength = i 
      min = cur 
     } 
    } ; 
for (i=1;i<=NF;i++) print $minlength}' 

Любая помощь была бы принята с благодарностью.

+1

Во втором сценарии, использование НАЧАТЬ показывает, что вам нужно прочитать на что BEGIN делает. Кроме того, вы говорите о файлах CSV, а awk-скрипты используют запятые в качестве разделителей, но ваши примеры не содержат в них запятых. Поскольку «CSV» в любом случае является весьма неоднозначным обозначением, это может помочь, если вы уточните, что вы имеете в виду. В частности, какое-либо из полей имеет встроенные разделители полей? Если значение в поле в файлах CSV выглядит как '' abc "' (то есть с внешними кавычками), следует ли считать, что оно имеет длину 3 или 5? Как насчет длины '' "" "'? – peak

ответ

3

Вам просто нужно установить начальные значения для мин и макс массивов, основанных на первой строке файла:

awk ' 
    NR==1 {for (i=1; i<=NF; i++) maxlen[i] = minlen[i] = length($i)} 
    { 
     for (i=1; i<=NF; i++) { 
      len = length($i) 
      if (len > maxlen[i]) maxlen[i] = len 
      if (len < minlen[i]) minlen[i] = len 
     } 
    } 
    END { 
     printf "Max Length" 
     for (i=1; i<=NF; i++) printf " %d", maxlen[i] 
     print "" 
     printf "Min Length" 
     for (i=1; i<=NF; i++) printf " %d", minlen[i] 
     print "" 
     printf "Diff" 
     for (i=1; i<=NF; i++) printf " %d", maxlen[i]-minlen[i] 
     print "" 
    } 
' file 
+0

Никогда не используйте 'l' (буква' el') как имя переменной, так как оно слишком много похоже на '1' (число' one'), неотличимое в некоторых шрифтах и, таким образом, запутывает ваш скрипт. Например, 'maxl [i] = l' похоже, что вы устанавливаете' maxl [i] '' '''''. Может быть, использовать 'cur' для соответствия' max' и 'min'? –