awk为什么不打印换行符?

问题描述:

我有一个文件,它看起来像这样:awk为什么不打印换行符?

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

我使用AWK只提取每nth行,其中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 

我尝试使用\n,printf\n等等,但它不像我预期的那样工作。请指教。

+2

您正在使用哪种外壳?这是一个非常规的提示,并不表示壳的类型。你如何证明数据是平坦的? – 2012-02-28 23:04:11

+1

您是否尝试更改RS变量? – 2012-02-28 23:14:32

+0

谢谢。我正在使用Cygwin,但是Shiplu提到的行终止符并不合适。 – mane 2012-02-28 23:21:29

一个松散的方式,

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

您也可以使用{printf("%s\n\n", $0)}了。如果单个\n不起作用。

如果它仍然不起作用,您可能需要检查行终止符。这可能不合适。使用awk中的RS变量在不常用的行终止符上分开。

+0

似乎根本不起作用。第二个产生一些错误。第一个不打印正确的结果。我其实想要将文件中的每一行都复制到另一个文件中,就这些了。 – mane 2012-02-28 23:01:03

+1

我认为你的文件行结束符不正确。 – 2012-02-28 23:11:09

+0

感谢Shiplu。行结束符不正确。它现在有效。 – mane 2012-02-28 23:21:52

使用以下与print每一行:

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

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

$ 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 
$ 

这会迷惑你。另见:Capturing multi-line output to a bash variable

+0

这工作正常。谢谢 – mane 2012-02-28 23:21:37