Gawk выводит наибольшее значение из каждого столбца - PullRequest
3 голосов
/ 09 декабря 2011

Я пишу сценарий 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
 }

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

Ответы [ 3 ]

1 голос
/ 09 декабря 2011

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

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

Кажется, что вы подходите с $ 2> $ 3сравнивать два столбца друг с другом.

1 голос
/ 09 декабря 2011

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

0 голосов
/ 09 декабря 2011

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

[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
...