awkスクリプトで選択した行を削除するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/1646129

  •  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] }'
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top