在GnuWin32
下运行Windows 7
。拥有这种结构的文件:
|<text_0>
<text_1>
<text_2>
until
<text_16>
|<text_0>
<text_1>
<text_2>
until
<text_12>
|<text_0>
<text_1>
<text_2>
until
<text_31>
< more of the same >
行之间的行数可变,以pipe
(分隔符号)开头。
期望的输出:
|<text_0><text_1><text_2> until <text_16>
|<text_0><text_1><text_2> until <text_12>
|<text_0><text_1><text_2> until <text_31>
在Windows中(因此双引号)尝试过(来自aypal singh和Ed Morton)
awk "{ ORS = (NR%2 ? FS : RS) } 1" < in.txt > out.txt
但如果该行以pipe
开头,则不会“跳过”向前一行附加一行。
如何修改awk
程序,将所有行附加到上一行,直到awk
遇到记录分隔符pipe
(并继续处理直到文件末尾)?< / p>
答案 0 :(得分:5)
你可以说:
$ awk -v RS="|" '{$1=RS$1} NF>1' a
|<text_0> <text_1> <text_2> until <text_16>
|<text_0> <text_1> <text_2> until <text_12>
|<text_0> <text_1> <text_2> until <text_31>
这会将记录分隔符设置为管道|
,然后使用$1=$1
表达式重构所有行。但是因为你想在每一行前面加一个管道,我们在这个分配中加上RS
。然后,我们评估NF>1
,以便打印非空行。