2016-03-29 43 views
1

我試圖使用AWK將新文本文檔中的每個單詞放在新行上。我真的不知道如何使用AWK,但是我發現了一些可以解決我的問題的命令。我試過下面的命令:使用AWK將文本文件中的每個單詞放在新行上

$ awk '{ for (i = 1; i <= NF; i++) print $i }' input.txt > output.txt 

$ awk '{c=split($0, s); for(n=1; n<=c; ++n) print s[n] }' input.txt > output.txt 

然而,這兩個命令具有相同的效果,這是所有的空間都被刪除。

爲了清楚起見,可以說input.txt中包含文本:

The fox jumped over the dog 

output.txt中應包含:

The 
fox 
jumped 
over 
the 
dog 

然而output.txt中包含:

Thefoxjumpedoverthedog 

我在Windows 7上使用Cygwin來使用這些命令。在命令中是否有我缺少的東西?

+0

這不是在標準awk中平臺可重複性。也許你的Awk打印Unix行結束,你用來檢查文件的工具不知道該如何處理它們? Awk腳本沒問題;如何讓他們在你的平臺上正確運行是這裏的主題,但這不是一個真正的編程問題。 – tripleee

+0

@tripleee謝謝,我認爲這將與Win/Unix系統之間的兼容性。 – hjalpmig

+0

啊,Windows和Unix的兼容性,是的。試試'cat -vet文件'。如果你在行尾看到'^ M $',使用'dos2unix file'來轉換爲unix格式。 (或者如果我誤解了你的數據的「方向」,還有'unix2dos文件'。祝你好運。 – shellter

回答

2

根據手冊頁,print在AWK打印它的參數:

當前輸出字段分隔符分隔,並以輸出記錄分隔符

所以,你的第一個命令就可以終止,但你需要確保你的輸出記錄分隔符是一個新行。默認的輸出記錄分隔符是換行,但儘量確保:

awk -v ORS='\n' '{ for (i = 1; i <= NF; i++) print $i }' input.txt > output.txt 

在Cygwin只,你可能會運行到與Windows/DOS行結束的問題。試試ORS='\r\n'。或者,通過unix2dos管道輸出。在AWK

$ echo "The fox jumped over the dog" | perl -ple 's/\h/\n/g' 
The 
fox 
jumped 
over 
the 
dog 

同一作品:

+0

這也給了我相同的錯誤輸出 – hjalpmig

+0

如果這是一個unix2dos類型的問題,你可以用'\ r \ n''來嘗試嗎? – szym

+0

加入'\ r \ n'解決了它,謝謝。 – hjalpmig

2

另一種選擇

echo "the fox jumped over the dog" | awk -v OFS="\n" '{$1=$1}1' 

從文件awk ... inputfile

但是

讀,我不相信這將解決你的情況。如果您awk壞了,你可以嘗試tr

echo ... | tr ' ' '\n' 

會做。

+0

你的第一個命令適合我。我怎樣才能改變它,以便不用輸入從文件中讀取它的文本,而是將輸出保存到另一個文件中? – hjalpmig

+0

和你平常一樣,'awk ... inputfile> outputfile' – karakfa

0

你可以平凡Perl中做到這一點

$ echo "The fox jumped over the dog" | awk '{gsub(/ /,"\n"); print}' 
The 
fox 
jumped 
over 
the 
dog 
相關問題