在awk中的两个模式之间循环处理线段吗?

问题描述

这实际上是this问题的延续版本:

我有一个文件

1
2
PAT1
3    - first block
4
PAT2
5
6
PAT1
7    - second block
PAT2
8
9
PAT1
10    - third block

,我使用awk '/PAT1/{flag=1; next} /PAT2/{flag=0} flag' 提取线段。

提取它们可以正常工作,但是我试图以逐块的方式遍历这些blook,并对每个块进行一些处理(例如,保存到文件,使用其他脚本进行处理等)。

如何构造这样的循环?

解决方法

问题不是很清楚,但是您可以执行以下操作:

awk '/PAT1/ {
   flag = 1
   ++n
   s = ""
   next
}
/PAT2/ {
   flag = 0
   printf "Processing record # %d =>\n%s",n,s
}
flag {
   s = s $0 ORS
}' file
Processing record # 1 =>
3    - first block
4
Processing record # 2 =>
7    - second block
,

这可能对您有用(GNU sed):

sed -ne '/PAT1/!b;:a;N;/PAT2/!ba;e echo process:' -e 's/.*/echo "&"|wc/pe;p' file

收集PAT1PAT2之间的界线并处理集合。

在上面的示例中,打印了文字process:

已构建并打印了用于收集集合的wc命令的结果的命令。

打印上述命令的评估结果。

p标志在替换命令中的位置很关键。如果pe标志之前,则图案空间在评估之前打印,如果p标志在e标志之后,则图案空间为后评估。 / p>