我想更好地理解awk:我经常搜索正则表达式,很多时候我只对第N次出现感兴趣。我总是用管道做这个任务说:
awk '/regex/' file | awk 'NR%N==0'
如何使用awk
(或perl
)执行相同的任务而无需管道?
在某些情况下,使用管道是计算效率最高的解决方案吗?
答案 0 :(得分:3)
只计算出现次数并打印每隔一个N:
BEGIN { n=0 }
/myregex/ { n++; if(n==3) { n=0; print } }
答案 1 :(得分: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
答案 2 :(得分:1)
试试这个:
awk '/yourRegex/{i++} i==N{print; exit;}' yourFile
这将只打印第N场比赛
哦,如果你需要每隔Nth
怎么样:
awk '/yourRegex/{i++} (!(i%N) && i){print; i=0}' yourFile
答案 3 :(得分:1)
您可以使用多个条件,例如:
awk -v N=10 '/regex/ { count++ } count == N { N=0; print $0 }'
答案 4 :(得分:1)
awk '/regex/ { c=(c+1)%N; if(c==0) print}' N=3