1

プログラムの出力をいくつかの awk コマンドでパイプしています。これまでのコマンドは次のとおりです。

myprogram | awk '/chk/ { if ( $12 > $13) printf("%s %d\n", $1, $12 - $13); else  printf("%s %d\n", $1, $13 - $12)  }  ' | awk '!x[$0]++'

最後のビットは貧乏人のuniqもので、私のターゲットでは利用できません。上記のコマンドを実行すると、次のような出力が生成される可能性があります。

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

私がしたいのはこれです:

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

つまり、特定のタグ (最初の「フィールド」) の最大値を持つ行のみを印刷したいと考えています。上記の例は、出力がソートされるという点で at データを表しています (あたかもsortコマンドを介してパイプ処理されたかのように)。

4

2 に答える 2

2

同様のニーズに対する私の回答に基づいて、このスクリプトは物事を整理し、大きな配列を蓄積しません。各グループの最高値の行を出力します。

#!/usr/bin/awk -f
{
    s = substr($0, 0, match($0, /,[^,]*$/))
    if (s != prevs) {
        if ( FNR > 1 ) print prevline
        prevval = $2
        prevline = $0
    }
    else if ( $2 > prevval ) {
        prevval = $2
        prevline = $0
    }
    prevs = s
}
END {
    print prevline
}
于 2009-10-29T23:28:48.110 に答える
1

アイテムをmyprogramから出力されたものと同じ順序にする必要がない場合は、次のように機能します。

... | awk '{ if ($2 > x[$1]) x[$1] = $2 } END { for (k in x) printf "%s %s", k, x[k] }'
于 2009-10-29T20:25:22.733 に答える