awkを使用して列の最大値を見つけて、データが見つかった行の他のフィールドを印刷するにはどうすればよいですか?

awkを使用して列の最大値を見つけて、データが見つかった行の他のフィールドを印刷するにはどうすればよいですか?

具体的な例は、列5で最大値を見つけ、その値に関連付けられている2番目のフィールドを見つけることです。たとえば、

1  text1  1   1   5
2  text2  2   2   10 
3  text3  3   3   15
4  text4  4   4   50
5  text5  5   5   25

これは私のスクリプトです。最大値を見つける関数で始まり、最大値が見つかった同じ行の2番目のフィールドのデータを印刷しようとします。

function max(val1,val2){
        if (val1 > val2)
                return val1
        else
                return val2
}

BEGIN {largest = 0}

{largest = max(largest,$5 + 0)}
$5 ~ largest {print $2}

END {}

これは最終的に印刷されます

text1
text2
text3
text4

これは、新しい最大値が見つかるたびに2番目のフィールドを印刷するためです。見つかった最後の最大値のみを印刷する方法を見つけようとしているので、 "text4"だけが印刷されます。閉じるブロックを入れようとしましたが、"$5 ~ largest {print $2}"構文エラーが発生しました。

ベストアンサー1

すべてのawkスクリプトは、次のように単純化できます。

awk 'max<$5 || NR==1{ max=$5; data=$2 } END{ print data }' infile

または、 5番目の列で「2番目の列のすべての行を同じ最大値に保ちます」。

awk 'max<$5 || NR==1 { max=$5; data=$2; next }
     max==$5{ data= data ORS $2 }
END{ print data }' infile

自分で作成したスクリプトに関して、入力ファイルを2回処理する必要があります。まず、最大値を見つけて、2番目にその最大値を持つ行の2番目の列を印刷する必要があります。次のようになります。

awk 'function max(val1, val2){
        if (val1 > val2)
                return val1
        else
                return val2
}

BEGIN { largest = 0 }

NR==FNR{ largest = max(largest,$5 + 0); next }
$5==largest { print $2 }' infile infile

おすすめ記事