Gawk печатает наибольшее значение из каждого столбца

Я пишу сценарий awk, который принимает несколько столбцов ввода в текстовом файле и распечатывает наибольшее значение в каждом столбце.

Вход:

 $cat numbers
    10      20      30.3    40.5
    20      30      45.7    66.1
    40      75      107.2   55.6
    50      20      30.3    40.5
    60      30      45.O    66.1
    70      1134.7  50      70
    80      75      107.2   55.6

Выход:

80  1134.7  107.2       70

Сценарий:

BEGIN {
val=0;
line=1;
}
{
if( $2 > $3 )
{
   if( $2 > val )
   {
      val=$2;
      line=$0;
   }
}
else
{
   if( $3 > val )
   {
      val=$3;
      line=$0;
   }
}
}
END{
print line
}

Токовый выход:

 60 30  45.O    66.1

Что я делаю не так первый скрипт на awk

======= РЕШЕНИЕ ======

 END {
  for (i = 0; ++i <= NF;)
   printf "%s", (m[i] (i < NF ? FS : RS))
   }
 {
 for (i = 0; ++i <= NF;)
   $i > m[i] && m[i] = $i
 }

Спасибо за помощь


person BillPull    schedule 09.12.2011    source источник
comment
Я не понимаю $2 > $3 и $3 > val тесты в вашем коде; они никак не связаны с описанием проблемы (поиск наибольшего значения в каждом столбце). Попробуйте awk '{print $1 $3;}' < numbers увидеть, что именно означают пронумерованные переменные.   -  person sarnold    schedule 09.12.2011
comment
ну $ 1 $ 2 и $ 3 - номера столбцов   -  person BillPull    schedule 09.12.2011
comment
Все идет нормально. Почему вы сравниваете номера столбцов друг с другом?   -  person sarnold    schedule 09.12.2011


Ответы (3)


Вы можете создать одну пользовательскую функцию, а затем передать ей отдельные массивы столбцов для получения максимального значения. Что-то вроде этого -

[jaypal:~/Temp] cat numbers
10 20 30.3 40.5
20 30 45.7 66.1
40 75 107.2 55.6
50 20 30.3 40.5
60 30 45.O 66.1
70 1134.7 50.0 70
80 75 107.2 55.6

[jaypal:~/Temp] awk '             
function max(x){i=0;for(val in x){if(i<=x[val]){i=x[val];}}return i;} 
{a[$1]=$1;b[$2]=$2;c[$3]=$3;d[$4]=$4;next} 
END{col1=max(a);col2=max(b);col3=max(c);col4=max(d);print col1,col2,col3,col4}' numbers
80 1134.7 107.2 70

или

awk 'a<$1{a=$1}b<$2{b=$2}c<$3{c=$3}d<$4{d=$4} END{print a,b,c,d}' numbers
person jaypal singh    schedule 09.12.2011

Поскольку у вас четыре столбца, вам понадобится как минимум четыре переменных, по одной для каждого столбца (или, если хотите, массив). И вам не нужно держать линию полностью. Обработайте каждый столбец независимо.

person Kevin    schedule 09.12.2011

Вам нужно адаптировать что-то вроде следующего для ваших целей, чтобы найти максимум в конкретном столбце (в данном случае - во втором).

awk 'BEGIN {max = 0} {if ($2>max) max=$2} END {print max}' numbers.dat

Подход, который вы используете с $ 2> $ 3, похоже, сравнивает два столбца друг с другом.

person Omar    schedule 09.12.2011
comment
Это просто печатает самое большое значение во всем файле, а не максимальное значение для каждого столбца. - person BillPull; 09.12.2011
comment
Это напечатает наибольшее значение в столбце 2 файла. Поэтому вам нужно обобщить его, чтобы он работал для всех столбцов. - person Omar; 09.12.2011