【发布时间】:2010-12-11 09:27:46
【问题描述】:
我正在通过一些 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 命令进行管道传输一样)。
【问题讨论】:
-
如果您发现自己在空间和速度方面受到挤压,并且这不是过早的优化,您可以将您的
if ... printf ... else ...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)(untested)
标签: sorting awk duplicate-removal