目前,我使用以下两个与一个管道连接的awk命令:
awk 'sub(/([^ ]+[ ]+){4}[^ ]+[ ]/,"")' ~/.bash_eternal_history | awk '!a[$0]++'
我想在一次awk调用中将它们组合在一起。我该如何修改上面的命令?
答案 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
备注强>
对于较旧的gawk(如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}/'
启用所有类型的空格作为分隔符。
实际上事实证明,在一些较旧的gawk中存在一些RE问题。第二行不返回gawk v3.1.5的任何行,但它适用于较新的gawk v4.1.3。
{{1}}