我通过一些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

也就是说,我想只打印具有对于给定的标签的最大值(第一“场”)线。上面的例子是代表在该输出将被排序(虽然它已通过一sort命令管道)。数据

有帮助吗?

解决方案

根据我的回答

类似的需求,这个剧本让事情才能,不积累了大阵。它打印与来自每个组的最高值的线路。

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

其他提示

如果你不需要的物品将在他们来自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