次のファイルがあります。
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
別の文字列として扱われます。