为什么awk不能打印出换行符?

9

我有一个长这样的文件:

1 
2
AA 
4
5
AA BB
7
8
AA BB CC
10
11
AA BB CC DD

我正在使用 awk 提取只包含每个第 n=3 行的信息。

>>awk 'NR%3==0' /input/file_foo >> output/file_foobar

输出结果显示为一行:
AA AA BB AA BB CC AA BB CC DD

我希望你能够将其呈现为:

AA 
AA BB 
AA BB CC 
AA BB CC DD 

我尝试使用\nprintf等方法,但是没有达到我预期的效果。请给予建议。


2
你使用的是哪个shell?这是一个不常规的提示,没有指示shell类型。你是如何展示数据在单行上是平坦的? - Jonathan Leffler
1
你试过更改RS变量了吗? - Shiplu Mokaddim
谢谢。我之前使用的是Cygwin,但像Shiplu提到的那样,行终止符不正确。 - mane
3个回答

9

一种冗长的方式,

awk '{ if (NR%3==0) { print $0}  }'

您还可以使用{printf("%s\n\n", $0)}。如果单个\n无法正常工作。

如果仍然无法正常工作,则可能需要检查行终止符。它可能不正确。在awk中使用RS变量来分隔不寻常的行终止符。


似乎完全不起作用。第二个会产生一些错误。第一个根本没有打印出正确的结果。我实际上只想将文件中每三行复制到另一个文件中,仅此而已。 - mane
1
我认为你的文件行终止符不正确。 - Shiplu Mokaddim
谢谢Shiplu。行终止符不正确。现在可以工作了。 - mane

3

我认为问题在于你展示数据的方式,而不是处理数据的方式。

$ cat x
1 
2
AA 
4
5
AA BB
7
8
AA BB CC
10
11
AA BB CC DD
$ awk 'NR%3==0' x
AA 
AA BB
AA BB CC
AA BB CC DD
$

我猜想你正在做类似以下的事情:

$ awk 'NR%3==0' x > y
$ x=$(<y)
$ echo $x
AA AA BB AA BB CC AA BB CC DD
$ echo "$x"
AA 
AA BB
AA BB CC
AA BB CC DD
$

这会让你感到困惑。另请参阅:将多行输出捕获为bash变量


2

使用以下代码与 print 一起用于每行:

awk 'NR%3==0 { print $0 }' /input/file_foo >> output/file_foobar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接