
次のファイルがあります。
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,
アイデアは簡単です。キーと値のmax
2つの配列があります。各行に保存された値が小さい場合、または保存された値がない場合は、現在の行()を配列の値として保存します。最後に、ブロックから配列を印刷します。$18
$21
$18
$21
$18
$0
$18
line
END{}
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
列キーと行番号キーを持つmax
3つの配列を使用します。最大値、最大値を含む行数、ファイルの各行を保存します。配列の各キーのブロック内に値を印刷します。このソリューションはファイル全体をメモリに読み込むため、大容量ファイルでは機能しません。 x
$18
z
max
x
z
END
x
z[x[i]]