我怎样才能删除与awk脚本选择的线路?
-
22-07-2019 - |
题
我通过一些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] }'
不隶属于 StackOverflow