目前,我使用的是一個管道連接以下兩個AWK命令:組合兩個awk的命令到一個
awk 'sub(/([^ ]+[ ]+){4}[^ ]+[ ]/,"")' ~/.bash_eternal_history | awk '!a[$0]++'
我想他們在一個AWK調用結合起來。我應該如何修改上面的命令?
目前,我使用的是一個管道連接以下兩個AWK命令:組合兩個awk的命令到一個
awk 'sub(/([^ ]+[ ]+){4}[^ ]+[ ]/,"")' ~/.bash_eternal_history | awk '!a[$0]++'
我想他們在一個AWK調用結合起來。我應該如何修改上面的命令?
您可以通過;
awk '{sub(/([^ ]+[ ]+){4}[^ ]+[ ]/,"")}; !a[$0]++' ~/.bash_eternal_history
注二等腳本移動到第一分隔:第一個動作,sub
應放置在{}
防止awk
從投擲輸出的兩倍。
這就像你的代碼:如果模式不匹配
awk 'sub(/([^ ]+[ ]+){4}[^ ]+[ ]/,"") && !a[$0]++' ~/.bash_eternal_history
第一部分返回false,如果換成串已經在哈希第二個條件返回false。
簡化示例
echo -e "xlmx\nxlmx\nyyy\nxlmx"|awk 'sub("lm", "") && !a[$0]++'
輸出:
xx
注
對於較早gawk(如3.1.5)必須使用來啓用{n,m}
RE區間表達式。在更新的版本中,它默認爲OP。
RE可能會降低一點。 [ ]
與簡單的空間完全相同,所以模式可能類似於/([^ ]+ +){4}[^ ]+ /
。或者要延長模式,請使用[[:space:]]
啓用所有類型的空白作爲分隔符。
事實上,事實證明,在一些舊的gawk有一些RE問題。第二行不返回gawk v3.1.5的任何行,但它可以與更新的gawk v4.1.3一起使用。
$ 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}/'
「man gawk」給我關於「--re-interval」選項的以下內容:默認情況下它們是啓用的,但此選項仍然適用於 與--traditional結合使用。所以,在使用gawk時,這僅僅適用於我的情況,「--re-interval」選項默認是啓用的。感謝您的回覆。 –
@HongyiZhao感謝您的評論!我修改了我的註釋。我用舊的'gawk'測試過,似乎自2005年以來默認行爲已經改變:) – TrueY
非常感謝。但是你的回覆中有一些拼寫錯誤。它應該修改如下:awk'{sub(/([^] + [] +){4} [^] + [] /,「」)}; ![$ 0] ++'〜/ .bash_eternal_history。 –
@HongyiZhao哦......對不起。希望它有幫助 – nu11p01n73R
恕我直言,這個代碼不等同於OP的請求。這將打印一行,即使沒有RE匹配被'sub'找到。 – TrueY