【问题标题】:Loop and process over blocks of lines between two patterns in awk?循环和处理awk中两个模式之间的线块?
【发布时间】:2021-01-22 01:52:04
【问题描述】:

这其实是thisquestion的续版:

我有一个文件

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,并对每个块进行一些处理(例如保存到文件、使用其他脚本处理等)。

我怎样才能构造这样的循环?

【问题讨论】:

    标签: unix awk sed text-processing


    【解决方案1】:

    问题不是很清楚,但你可以这样做:

    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
    

    【讨论】:

    • 这看起来在正确的轨道上。如果不是打印我想保存每个块(s 变量在一个名为 record%d 的单独文件中?
    • 当然你可以为所欲为。我使用print 只是为了演示目的,因为问题只是说处理记录。只需将printf 替换为print s > ("record" n); close(("record" n))
    【解决方案2】:

    这可能对你有用(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 标志之后,则模式空间在评估之后。

    【讨论】:

      猜你喜欢
      • 2023-01-13
      • 2013-08-21
      • 2019-09-28
      • 1970-01-01
      • 1970-01-01
      • 2017-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多