【问题标题】:How to iteratively find number of lines between two patterns?如何迭代地找到两个模式之间的行数?
【发布时间】:2022-01-31 18:06:34
【问题描述】:

这个问题类似,但与123 不同。

我不想在两个模式之间粘贴线条,而是想迭代地计算线条。

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

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

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

3
5
1
2

有什么建议吗?

【问题讨论】:

  • 请用您尝试过的代码更新问题
  • 最后一行是否总是包含123
  • awk -v pat="123" '$0~pat{if (seen) print FNR-seen-1; seen=FNR}' file

标签: bash awk sed


【解决方案1】:
awk '$0=="123" {if (n) print NR-1-n; n=NR}' file

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

【讨论】:

  • 隐式计数器的使用非常好。
【解决方案2】:

使用您显示的示例/尝试,请尝试遵循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(字段总数),这将是行数介于模式之间。

【讨论】:

    【解决方案3】:

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

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

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

    匹配123,获取下一行,如果不匹配,将结果存储在保持空间并重复。

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

    清除保持空间,换回模式空间并重复。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-30
      • 1970-01-01
      • 2018-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-24
      相关资源
      最近更新 更多