2012-02-28 141 views
8

我有一個文件,它看起來像這樣: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

回答

8

一個鬆散的方式,

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

2

使用以下與print每一行:

awk 'NR%3==0 { print $0 }' /input/file_foo >> output/file_foobar 
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 
$ 

這會迷惑你。另見:Capturing multi-line output to a bash variable

+0

這工作正常。謝謝 – mane 2012-02-28 23:21:37