2016-01-22 63 views
0

目前,我使用的是一個管道連接以下兩個AWK命令:組合兩個awk的命令到一個

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

我想他們在一個AWK調用結合起來。我應該如何修改上面的命令?

回答

0

您可以通過;

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

注二等腳本移動到第一分隔:第一個動作,sub應放置在{}防止awk從投擲輸出的兩倍。

+0

非常感謝。但是你的回覆中有一些拼寫錯誤。它應該修改如下:awk'{sub(/([^] + [] +){4} [^] + [] /,「」)}; ![$ 0] ++'〜/ .bash_eternal_history。 –

+0

@HongyiZhao哦......對不起。希望它有幫助 – nu11p01n73R

+0

恕我直言,這個代碼不等同於OP的請求。這將打印一行,即使沒有RE匹配被'sub'找到。 – TrueY

0

這就像你的代碼:如果模式不匹配

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

第一部分返回false,如果換成串已經在哈希第二個條件返回false。

簡化示例

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

輸出:

xx 

  • 對於較早(如3.1.5)必須使用來啓用{n,m} RE區間表達式。在更新的版本中,它默認爲OP。

  • RE可能會降低一點。 [ ]與簡單的空間完全相同,所以模式可能類似於/([^ ]+ +){4}[^ ]+ /。或者要延長模式,請使用[[:space:]]啓用所有類型的空白作爲分隔符。

  • 事實上,事實證明,在一些舊的有一些RE問題。第二行不返回 v3.1.5的任何行,但它可以與更新的 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}/' 
+0

「man gawk」給我關於「--re-interval」選項的以下內容:默認情況下它們是啓用的,但此選項仍然適用於 與--traditional結合使用。所以,在使用gawk時,這僅僅適用於我的情況,「--re-interval」選項默認是啓用的。感謝您的回覆。 –

+0

@HongyiZhao感謝您的評論!我修改了我的註釋。我用舊的'gawk'測試過,似乎自2005年以來默認行爲已經改變:) – TrueY