简体   繁体   中英

awk regular expression print every N occurence

I would like to understand awk a little better: I often search for regular expressions and many times I am interested only in the Nth occurrence. I always did this task using pipes say:

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

How can I do the same task with awk (or perl ) without piping ?

Are there some instances in which using pipes is the most computationally efficient solution?

Just count the occurences and print every other Nth:

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

Every third:

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

For example:

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

try this:

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

this will print only the Nth match

Oh, if you need every Nth

how about:

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

您可以使用多个条件,例如:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM