如何使用awk脚本删除选定的行?

时间:2009-10-29 19:48:08

标签: sorting awk duplicate-removal

我通过一些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命令传送的。)

2 个答案:

答案 0 :(得分:2)

根据我对answer的类似需求,此脚本可以保持整齐,并且不会累积大数组。它打印每组中具有最高值的行。

#!/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
}

答案 1 :(得分:1)

如果您不需要将这些项目按照相同的顺序从myprogram输出,则以下工作:

... | awk '{ if ($2 > x[$1]) x[$1] = $2 } END { for (k in x) printf "%s %s", k, x[k] }'