我想知道如何使用 Awk 来处理每两行数据而不是每一行。默认情况下,记录分隔符 (RS) 设置为每个新行,如何将其更改为每 2 行。
问问题
7329 次
4 回答
6
这取决于您想要实现的目标,但一种方法是使用getline
指令。对于每一行,读取下一行并将其保存在变量中。因此,您将有第一行 in$0
和第二行 in even_line
:
getline even_line
于 2012-08-11T09:57:35.990 回答
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
于 2012-08-11T11:54:27.807 回答
5
分而治之:分两步进行:
- 使用 awk 引入空行
来分隔每条两行记录:NR%2==0 {print ""}
- 管道到另一个 awk 进程并将
记录分隔符设置为空行:BEGIN {RS=""}
优点:在第二个awk
过程中,您可以将两行的所有字段作为$1 to $NF
.
awk '{print}; NR%2==0 {print ""}' data | \
awk 'BEGIN {RS=""}; {$1=$1;print}'
注意:
$1=$1
此处用于强制更新$0
(整个记录)。
这保证了输出在一行上打印两行记录。
在处理两行记录时修改程序中的字段后,就不再需要了。
于 2012-08-11T09:55:52.057 回答
4
这有点骇人听闻,但这是对您问题的字面回答:
awk 'BEGIN {RS = "[^\n]*\n[^\n]*\n"} {$0 = RT; print $1, $NF}' inputfile
将记录分隔符设置为匹配两行的正则表达式。然后对于每一行,设置$0
为记录终止符(与 中的正则表达式匹配RS
)。这将在 上执行字段拆分FS
。print 语句只是一个演示占位符。
请注意,$0
它将包含两个换行符,但字段将不包含任何换行符。
于 2012-08-11T21:24:50.963 回答