awkスクリプトで選択した行を削除するにはどうすればよいですか?
-
22-07-2019 - |
質問
私はいくつかのawkコマンドを介してプログラムの出力をパイピングしています。これまでのコマンドは次のとおりです。
myprogram | awk '/chk/ { if ( $12 > $13) printf("%s %d\n", $1, $12 - $13); else printf("%s %d\n", $1, $13 - $12) } ' | awk '!x[GR_CB20-chk_2, 0
GR_CB20-chk_2, 3
GR_CB200-chk_2, 0
GR_CB200-chk_2, 1
GR_HB20-chk_2, 0
GR_HB20-chk_2, 6
GR_HB20-chk_2, 0
GR_HB200-chk_2, 0
GR_MID20-chk_2, 0
GR_MID20-chk_2, 3
GR_MID200-chk_2, 0
GR_MID200-chk_2, 2
]++'
最後のビットは貧乏人の uniq
であり、これはターゲットでは使用できません。上記のコマンドが次のような出力を生成する可能性がある場合:
GR_CB20-chk_2, 3
GR_CB200-chk_2, 1
GR_HB20-chk_2, 6
GR_HB200-chk_2, 0
GR_MID20-chk_2, 3
GR_MID200-chk_2, 2
私が持ちたいのはこれです:
<*>つまり、特定のタグ(最初の「フィールド」)の最大値を持つ行のみを印刷したいと思います。上記の例は、( sort
コマンドを介してパイプされたように)出力がソートされるという点でatデータを表しています。
解決
回答に基づいて同様に、このスクリプトは物事を整理し、大きな配列を蓄積しません。各グループの最高値を持つ行を印刷します。
#!/usr/bin/awk -f
{
s = substr(<*>, 0, match(<*>, /,[^,]*$/))
if (s != prevs) {
if ( FNR > 1 ) print prevline
prevval = $2
prevline = <*>
}
else if ( $2 > prevval ) {
prevval = $2
prevline = <*>
}
prevs = s
}
END {
print prevline
}
他のヒント
アイテムがmyprogramから出力された順序と同じ順序である必要がない場合、次のように動作します:
... | awk '{ if ($2 > x[$1]) x[$1] = $2 } END { for (k in x) printf "%s %s", k, x[k] }'
所属していません StackOverflow