awk将记录分隔符(RS)更改为每2行

时间:2012-08-11 09:48:46

标签: bash command-line awk

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

4 个答案:

答案 0 :(得分:6)

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

getline even_line

答案 1 :(得分:5)

分而治之:分两步完成:

  1. 使用awk引入空白行
    将每个两行记录分开:NR%2==0 {print ""}
  2. 管道到另一个awk进程和
    将记录分隔符设置为空行:BEGIN {RS=""}
  3. 优势:在第二个awk流程中,您可以将这两行的所有字段都显示为$1 to $NF

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

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

答案 2 :(得分:5)

如果要合并线条,请使用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 

答案 3 :(得分:4)

这有点hackish,但它是你问题的字面答案:

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

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

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