awk比較のための配列の使用

awk比較のための配列の使用

次のファイルがあります。

6180,6180,0,1,,1,0,1,1,0,0,0,0,0,0,0,0,4326,4326,,0.440000,
6553,6553,0,1,,1,0,1,1,0,0,0,0,1,0,1,0,4326,4326,,9.000000,
1297,1297,0,0,,0,0,1,0,0,0,0,0,1,0,1,0,1707,1707,,7.000000,
6598,6598,0,1,,1,0,1,1,0,0,0,1,0,0,0,0,1390,1390,,0.730000,
4673,4673,0,1,,1,0,1,1,0,0,0,0,0,0,0,0,1707,1707,,0.000000,

$ 18から$ 21の最大値を印刷するには、awkコマンドが必要です。

希望の出力は次のとおりです。

6553,6553,0,1,,1,0,1,1,0,0,0,0,1,0,1,0,4326,4326,,9.000000,
1297,1297,0,0,,0,0,1,0,0,0,0,0,1,0,1,0,1707,1707,,7.000000,
6598,6598,0,1,,1,0,1,1,0,0,0,1,0,0,0,0,1390,1390,,0.730000,

この結果が得られましたが、次のように sort コマンドを使用します。

sort -t, -k18,18n -k21,21nr | awk -F"," '!a[$18]++'

単一のawkコマンドで実行したいのですが。

アドバイスしてください、

ベストアンサー1

awk私はあなたがコマンドでそれをしたい理由を理解していません。あなたが持っているものはかなりよさそうです。とにかく1つの方法は次のとおりです。

$ awk -F, '(max[$18]<$21 || max[$18]==""){max[$18]=$21;line[$18]=$0}
            END{for(key in line){print line[key]}}' file
6598,6598,0,1,,1,0,1,1,0,0,0,1,0,0,0,0,1390,1390,,0.730000,
1297,1297,0,0,,0,0,1,0,0,0,0,0,1,0,1,0,1707,1707,,7.000000,
6553,6553,0,1,,1,0,1,1,0,0,0,0,1,0,1,0,4326,4326,,9.000000,

アイデアは簡単です。キーと値のmax2つの配列があります。各行に保存された値が小さい場合、または保存された値がない場合は、現在の行()を配列の値として保存します。最後に、ブロックから配列を印刷します。$18$21$18$21$18$0$18lineEND{}line

上記のスクリプトはそれを$18文字列として扱います。したがって001、とは1別の文字列として扱われます。

おすすめ記事