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別の文字列として扱われます。

答え2

uniq代わりに使用するのが少し速いですawk

sort -t, -k18,18nr -k21,21nr | uniq -s39 -w4

答え3

次のことを試すことができますawk

awk -F"," '{ if (max[$18] < $21) { max[$18] = $21; x[$18] = NR; } z[NR] = $0; } END { for (i in x) print z[x[i]]; }' file

列キーと行番号キーを持つmax3つの配列を使用します。最大値、最大値を含む行数、ファイルの各行を保存します。配列の各キーのブロック内に値を印刷します。このソリューションはファイル全体をメモリに読み込むため、大容量ファイルでは機能しません。 x$18zmaxxzENDxz[x[i]]

関連情報