2011-10-25 46 views
2

我想更好地理解awk:我經常搜索正則表達式,並且很多次我只對第N次出現感興趣。我一直沒有使用管道這個任務說:awk正則表達式打印每N次出現

awk '/regex/' file | awk 'NR%N==0' 

我如何做awk(或perl相同的任務不包括管道

是否存在使用管道是計算效率最高的解決方案的一些實例?

+0

你的意思是*每* N個發生,對嗎? –

回答

3

每三:

awk '/line/ && !(++c%3)' infile 

例如:

zsh-4.3.12[t]% cat infile 
1line 
2line 
3line 
4line 
5line 
6line 
7line 
8line 
9line 
10line 
zsh-4.3.12[t]% awk '/line/ && !(++c%3)' infile 
3line 
6line 
9line 
zsh-4.3.12[t]% awk '/line/ && !(++c%2)' infile 
2line 
4line 
6line 
8line 
10line 
+0

太棒了!我還可以指定是否需要奇數行或偶數行! awk'/ regex/&&(++ c%2 == 1)'文件 – Mareczek

+0

是,甚至是:'awk'/ regex/&& ++ c%2'file' –

1

試試這個:

awk '/yourRegex/{i++} i==N{print; exit;}' yourFile 

這將打印其中只有第N匹配

哦,如果你需要每N

怎麼樣:

awk '/yourRegex/{i++} (!(i%N) && i){print; i=0}' yourFile 
+0

一旦'i == N',這將打印每一行,直到再次看到正則表達式。這兩種形式都有這個問題。 –

+0

你的第一個解決方案打印第N個正則表達式後面的行,第二個解決方案不適合我 – Mareczek

+0

好點!更新。 – Kent

3

只是算髮生並隔行打印:N:

BEGIN { n=0 } 
/myregex/ { n++; if(n==3) { n=0; print } } 
+0

BEGIN在這裏是可選的,n將默認爲0. –

+0

@ MichaelJ.Barber - 你說得對。在嵌入式系統上工作了很多年,我的大腦受到了破壞,並且進行了強制變量初始化。 – mouviciel

+0

非常感謝你! – Mareczek

1

您可以使用多個條件,例如:

awk -v N=10 '/regex/ { count++ } count == N { N=0; print $0 }' 
1
awk '/regex/ { c=(c+1)%N; if(c==0) print}' N=3 
+0

這是正確的嗎?如果前100行不匹配「正則表達式」,那麼將全部打印出來?因爲c會是0 – Kent

+0

@Kent:thx ..還原了它。原本是可以的,但後來我想我可以簡化它,並在這個過程中我創建了一個bug –

+0

謝謝你!另外我也不知道寫N = 3的可能性非常感謝 – Mareczek