регулярное выражение awk печатать каждый раз N - PullRequest
2 голосов
/ 25 октября 2011

Я хотел бы немного лучше понять awk: я часто ищу регулярные выражения и много раз меня интересует только N-е вхождение. Я всегда делал эту задачу, используя трубы говорят:

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

Как я могу выполнить ту же задачу с awk (или perl) без трубопровода ?

Существуют ли случаи, когда использование каналов является наиболее эффективным в вычислительном отношении решением?

Ответы [ 5 ]

3 голосов
/ 25 октября 2011

Каждый третий:

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
3 голосов
/ 25 октября 2011

Просто посчитайте случаи и напечатайте все остальные Nth:

BEGIN { n=0 }
/myregex/ { n++; if(n==3) { n=0; print } }
1 голос
/ 25 октября 2011
awk '/regex/ { c=(c+1)%N; if(c==0) print}' N=3
1 голос
/ 25 октября 2011

Вы можете использовать несколько условий, например:

awk -v N=10 '/regex/ { count++ } count == N { N=0; print $0 }'
1 голос
/ 25 октября 2011

попробуйте это:

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

при этом будет напечатан только N-й матч

О, если вам нужно каждый N-й

как насчет:

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