【发布时间】:2012-08-08 11:04:40
【问题描述】:
我想知道如何使用 Awk 来处理每 2 行数据而不是每行数据。默认情况下,记录分隔符 (RS) 设置为每个新行,如何将其更改为每 2 行。
【问题讨论】:
标签: bash command-line awk
我想知道如何使用 Awk 来处理每 2 行数据而不是每行数据。默认情况下,记录分隔符 (RS) 设置为每个新行,如何将其更改为每 2 行。
【问题讨论】:
标签: bash command-line awk
分而治之:分两步进行:
NR%2==0 {print ""}
BEGIN {RS=""}
优势:在第二个awk 进程中,您可以将这两行的所有字段作为$1 to $NF 访问。
awk '{print}; NR%2==0 {print ""}' data | \
awk 'BEGIN {RS=""}; {$1=$1;print}'
注意:$1=$1 在此处用于强制更新 $0(整个记录)。
这保证了输出在一行上打印两行记录。
在处理两行记录时修改程序中的字段后,就不再需要了。
【讨论】:
这取决于您想要实现的目标,但一种方法是使用getline 指令。对于每一行,读取下一行并将其保存在变量中。所以你将在$0 中有第一行,在even_line 中有第二行:
getline even_line
【讨论】:
如果要合并行,请使用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
【讨论】:
这有点骇人听闻,但这是对您问题的字面回答:
awk 'BEGIN {RS = "[^\n]*\n[^\n]*\n"} {$0 = RT; print $1, $NF}' inputfile
将记录分隔符设置为匹配两行的正则表达式。然后对于每一行,将$0 设置为记录终止符(与RS 中的正则表达式匹配)。这将对FS 执行字段拆分。 print 语句只是一个演示占位符。
请注意,$0 将包含两个换行符,但字段不会包含任何换行符。
【讨论】: