2012-03-26 64 views
0

我正在嘗試編寫一個bash腳本,它返回文件的三個單詞短語的所有內容,後面跟着一個換行符。一個例子是這樣的:處理文件'交錯'格式

input : This is a file with words in it 

output: 
this is a 
is a file 
a file with 
file with words 
with words in 
words in it 

值得注意的是,它需要「字」,可爲了這個目的,被看作是空白同一符號的概念。另外,在...中不是三個字的短語。最終,我想採用這種格式的文件,並將它們排列在一起,但是這一步讓我感動,因爲它似乎需要某種能力來「告訴文件中的下一個內容」,並且也不會超出範圍在最後幾個。

回答

2

您可以awktr做(加入多行):

tr '\n' ' ' < file.txt | awk '{ for(i=3; i<=NF; i++) { print $(i-2) " " $(i-1) " " $i }}' 
+0

這個整齊地指出我用「i-2」,「i-1」位遇到的「向前看」的想法。謝謝,這比我想象的要簡單。 – 2012-03-26 18:47:09

+0

+1。智能啓動索引3的循環,而不是在結束條件下進行算術運算。可讀。 – 2012-03-26 18:58:38

-1

如果文件不是「大」,你可以在其中使用for遍歷的話:

for word in $(cat input.txt); do echo $word; done 

如果文件是太大了,你可以用read閱讀在時間線,然後for遍歷該行的話:

while read line; do for word in $line; do echo $word; done; done < input.txt 

對於循環的主體,只要跟蹤「last_word」和「word_before_that」,只要所有三個都是非空的,你應該沒問題。

+0

'while read -ra line;在「$ {line [@]}」中輸入單詞;做...'。如果你仍然想遵循你的想法,那麼'$ line'中的單詞可能會很好。 – jordanm 2012-03-26 19:23:49

+0

@jordanm,出色的建議,我已經解決了我的答案。 – 2012-03-26 23:29:22

+0

-a arg要讀取才能工作,因爲這是讀取會將行分割爲數組而不是標量的原因。 – jordanm 2012-03-27 13:51:07