循环和处理 awk 中两种模式之间的行块?
Loop and process over blocks of lines between two patterns in awk?
这实际上是问题的续版:
我有一个文件
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'
提取行块。
提取它们工作正常,但我正在尝试以逐块的方式迭代这些块,并对每个块进行一些处理(例如保存到文件、使用其他脚本处理等)。
如何构造这样的循环?
问题不是很清楚,但你可以这样做:
awk '/PAT1/ {
flag = 1
++n
s = ""
next
}
/PAT2/ {
flag = 0
printf "Processing record # %d =>\n%s", n, s
}
flag {
s = s [=10=] 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
收集 PAT1
和 PAT2
之间的行并处理集合。
在上面的示例中,打印了文字 process:
。
打印集合wc
命令结果的命令已构建并打印。
打印上述命令的计算结果。
N.B。 p
标志在替换命令中的位置很关键。如果 p
在 e
标志之前,模式 space 在评估之前打印,如果 p
标志在 e
标志之后,模式 space是post评价。
这实际上是
我有一个文件
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'
提取行块。
提取它们工作正常,但我正在尝试以逐块的方式迭代这些块,并对每个块进行一些处理(例如保存到文件、使用其他脚本处理等)。
如何构造这样的循环?
问题不是很清楚,但你可以这样做:
awk '/PAT1/ {
flag = 1
++n
s = ""
next
}
/PAT2/ {
flag = 0
printf "Processing record # %d =>\n%s", n, s
}
flag {
s = s [=10=] 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
收集 PAT1
和 PAT2
之间的行并处理集合。
在上面的示例中,打印了文字 process:
。
打印集合wc
命令结果的命令已构建并打印。
打印上述命令的计算结果。
N.B。 p
标志在替换命令中的位置很关键。如果 p
在 e
标志之前,模式 space 在评估之前打印,如果 p
标志在 e
标志之后,模式 space是post评价。