使用awk或sed在两个模式之间进行第n次出现

Dan*_*ess 8 shell awk sed

我有一个问题,我想解析文件的输出,我想在两个模式之间抓取第n次出现的文本,最好使用awk或sed

category
1
s
t
done
category
2
n
d
done
category
3
r
d
done
category
4
t
h
done
Run Code Online (Sandbox Code Playgroud)

让我们说这个例子我想在类别和完成之间抓取第三次出现的文本,基本上是输出

category
3
r
d
done
Run Code Online (Sandbox Code Playgroud)

pot*_*ong 8

这可能适合你(GNU sed):

'sed -n '/category/{:a;N;/done/!ba;x;s/^/x/;/^x\{3\}$/{x;p;q};x}' file
Run Code Online (Sandbox Code Playgroud)

使用该-n选项关闭自动打印.收集category和之间的界限done.将计数器存放在保持空间中,当它达到3时,将图案空间中的集合打印出来并退出.

或者如果你喜欢awk:

awk  '/^category/,/^done/{if(++m==1)n++;if(n==3)print;if(/^done/)m=0}'  file
Run Code Online (Sandbox Code Playgroud)

  • 只是好奇:为什么?它正在多次测试相同的条件,如果您的输入文件略有变化,它将无法工作.如果您对只能使用已发布的输入格式的解决方案感到满意,@ sputnik的解决方案会更加简洁. (2认同)

Gil*_*not 6

试着这样做:

 awk -v n=3 '/^category/{l++} (l==n){print}' file.txt
Run Code Online (Sandbox Code Playgroud)

或者更神秘:

awk -v n=3 '/^category/{l++} l==n' file.txt
Run Code Online (Sandbox Code Playgroud)

如果您的文件很大:

awk -v n=3 '/^category/{l++} l>n{exit} l==n' file.txt
Run Code Online (Sandbox Code Playgroud)