繁体   English   中英

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

[英]How can I remove selected lines with an awk script?

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

根据我对类似需求的回答 ,此脚本可以使事情井井有条,并且不会累积大量数组。 它打印每个组中具有最高值的行。

#!/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 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM