【问题标题】:awk to change the record separator (RS) to every 2 linesawk 将记录分隔符 (RS) 更改为每 2 行
【发布时间】:2012-08-08 11:04:40
【问题描述】:

我想知道如何使用 Awk 来处理每 2 行数据而不是每行数据。默认情况下,记录分隔符 (RS) 设置为每个新行,如何将其更改为每 2 行。

【问题讨论】:

    标签: bash command-line awk


    【解决方案1】:

    分而治之:分两步进行:

    1. 使用 awk 引入空行
      分隔每条两行记录:NR%2==0 {print ""}
    2. 管道到另一个 awk 进程和
      将记录分隔符设置为空行:BEGIN {RS=""}

    优势:在第二个awk 进程中,您可以将这两行的所有字段作为$1 to $NF 访问。

    awk '{print}; NR%2==0 {print ""}' data | \
    awk 'BEGIN {RS=""}; {$1=$1;print}'
    

    注意:
    $1=$1 在此处用于强制更新 $0(整个记录)。
    这保证了输出在一行上打印两行记录。
    在处理两行记录时修改程序中的字段后,就不再需要了。

    【讨论】:

      【解决方案2】:

      这取决于您想要实现的目标,但一种方法是使用getline 指令。对于每一行,读取下一行并将其保存在变量中。所以你将在$0 中有第一行,在even_line 中有第二行:

      getline even_line
      

      【讨论】:

        【解决方案3】:

        如果要合并行,请使用paste 实用程序:

        $ printf "%s\n" one two three four five
        one
        two
        three
        four
        five
        
        $ printf "%s\n" one two three four five | paste -d " " - -
        one two
        three four
        five 
        

        【讨论】:

          【解决方案4】:

          这有点骇人听闻,但这是对您问题的字面回答:

          awk 'BEGIN {RS = "[^\n]*\n[^\n]*\n"} {$0 = RT; print $1, $NF}' inputfile
          

          将记录分隔符设置为匹配两行的正则表达式。然后对于每一行,将$0 设置为记录终止符(与RS 中的正则表达式匹配)。这将对FS 执行字段拆分。 print 语句只是一个演示占位符。

          请注意,$0 将包含两个换行符,但字段不会包含任何换行符。

          【讨论】:

          • 我认为非常有用!
          猜你喜欢
          • 1970-01-01
          • 2017-11-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多