如何迭代查找两个模式之间的行数?

How to iteratively find number of lines between two patterns?

这个问题与, 2, and 3相似,但不同。

我不想在两个模式之间粘贴线条,而是想对线条进行迭代计数。

例如,给定 file.txt 这些字符串

abc
123
daafsd
asdfas
asdcasdfa
123
sdfasdc
asdfasdcasd
asdfasdfasdf
asdfasdfasdf
ascasdcasdcasd
123
asdcasdfacasdcas
123
asdfasdcasdcasc
asadfasdfas
123

我想计算 123 模式之间的行数。因此,预期输出为:

3
5
1
2

有什么建议吗?

awk '[=10=]=="123" {if (n) print NR-1-n; n=NR}' file

这使用匹配行的行号来打印它们之间的行数。

根据您显示的 samples/attempts,请尝试以下 awk 代码。

awk -v RS='(^|\n)123(\n|$)' 'FNR>1 && NF{print NF}' Input_file

对于所示示例,输出如下:

3
5
1
2

解释:

  • awk程序中设置RS(记录分隔符)为(^|\n)123(\n|$).
  • 正则表达式的解释 (^|\n)123(\n|$):将记录分隔符设置为 123(可以在行的开头出现,也可以在后面或以新行开始,或者以 123 结尾),如示例所示。
  • 然后在主程序中检查条件,如果行号大于 1 并且 NF(字段数)不为零,则打印该行的 NF(字段总数),这将是模式之间的行数。

这可能对你有用(GNU sed 和 wc):

sed -En ':a;/123/{:b;n;//!{H;bb};x;s/.(.*)/echo ""|wc -l/ep;z;x;ba}' file

打开扩展正则表达式 -E 并关闭隐式打印 -n

123上匹配,获取下一行,如果不匹配,将结果存储在hold space中并重复。

在替换命令中,评估行尾的结果并使用 wc -l 对它们进行计数。

清除保留 space,换回模式 space 并重复。