将两个awk命令合并为一个

时间:2016-01-22 03:13:22

标签: awk

目前,我使用以下两个与一个管道连接的awk命令:

awk 'sub(/([^ ]+[ ]+){4}[^ ]+[ ]/,"")'  ~/.bash_eternal_history | awk '!a[$0]++'

我想在一次awk调用中将它们组合在一起。我该如何修改上面的命令?

2 个答案:

答案 0 :(得分:0)

您可以将第二个脚本移动到由;

分隔的第一个脚本
awk '{sub(/([^ ]+[ ]+){4}[^ ]+[ ]/,"")}; !a[$0]++'  ~/.bash_eternal_history

注意:第一个操作sub应放在{}中,以防止awk两次抛出输出。

答案 1 :(得分:0)

这就像你的代码一样:

echo -e "xlmx\nxlmx\nyyy\nxlmx"|awk 'sub("lm", "") && !a[$0]++'

如果模式不匹配,则第一部分返回false;如果替换的字符串已经在散列中,则第二部分返回false。

简化示例

xx

输出:

--re-interval

备注

  • 对于较旧的(如3.1.5),必须使用{n,m}来启用[ ] RE间隔表达式。在较新的版本中,它默认为OP注明。

  • RE可以减少一点。 /([^ ]+ +){4}[^ ]+ /与简单空格相同,因此模式可能类似于[[:space:]]。或者要扩展模式,请使用$ echo -e "al\na b c \n a"|awk --re-interval '/([^ ]+ +){2}/' a b c $ echo -e "al\na b c \n a"|awk --re-interval '/([^ ]+[ ]+){2}/' 启用所有类型的空格作为分隔符。

  • 实际上事实证明,在一些较旧的中存在一些RE问题。第二行不返回 v3.1.5的任何行,但它适用于较新的 v4.1.3。

{{1}}