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

Sorting 如何使用awk脚本删除选定的行?,sorting,awk,duplicate-removal,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

我正在通过一些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
命令进行管道传输的)。

如果您不需要项目与从myprogram中输出的项目顺序相同,则以下操作有效:

... | awk '{ if ($2 > x[$1]) x[$1] = $2 } END { for (k in x) printf "%s %s", k, x[k] }'
基于我对类似需求的理解,这个脚本保持了事情的有序性,并且没有积累大的数组。它打印每组中具有最高值的行

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

只是缺少printf()中的“\n”。否则就完美了。啊,对。我的测试版本中有,但在这里输入时忘记了。:)更快,而且因为内存是一个问题(它是一个嵌入式环境),我把它作为正确的答案。如果你发现自己在空间和速度上受到挤压,而且这不是过早的优化,那么如果。。。打印。。。否则…printf…使用更短、至少在我的系统上更快的“穷人的
abs()
”:printf(“%s%d\n”,$1,(($12>$13)*2-1)*($12-$13))`另外,请注意过滤
/chk/
上的行的
awk
命令可以组合到下面的脚本中(使用mods保存适当的“prev”字段而不是整行,等等),因此您只需调用一次
awk
。在我的脚本顶部,
s
将设置为
($12>$13)*2-1)*($12-$13)
(未测试)