3

テキストファイルの入力のいくつかの列を取り、各列の最大値を出力する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
 }

助けてくれてありがとう

4

3 に答える 3

1

4つの列があるため、各列(または必要に応じて配列)に1つずつ、少なくとも4つの変数が必要になります。また、行全体を保持する必要はありません。各列を個別に扱います。

于 2011-12-09T03:15:00.283 に答える
1

特定の列(この場合は2番目)で最大値を見つける目的に合わせて、次のようなものを適応させる必要があります。

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

$ 2> $ 3で採用しているアプローチは、2つの列を相互に比較しているようです。

于 2011-12-09T03:16:28.723 に答える
0

1つのユーザー定義関数を作成し、それに個々の列配列を渡して最大値を取得できます。このようなもの -

[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
于 2011-12-09T04:11:40.920 に答える