2015-07-02 83 views
0

我正在嘗試編寫一個shell腳本以從文件中刪除單詞。單詞在另一個文件中給出。例如:
關於刪除文件中的單詞的shell腳本

輸入文件:

I am new in shell script,so I need you help ,thank you 

words文件:

am 
in 
so 

和輸出文件應該是:

I new shell script, I need you help ,thank you 

我嘗試寫這樣一個劇本:

cat words_file | while read line 
do 
     sed "s/$line//g" input >output 
done 

但是隻有最後一個單詞「so」可以被刪除,我怎樣才能在每個循環中保存結果,以便我可以刪除每一個單詞,或者有另一種方法來解決這個問題?

回答

0

我會更好地去使用awk此任務:

awk 'FNR==NR {words[$1]; next} 
    {for (i=1;i<=NF;i++) if ($i in a) $i=""}1' 
    words input 

處理文件:

$ awk 'FNR==NR {words[$1]; next} {for (i=1;i<=NF;i++) if ($i in words) $i=""}1' words input 
I new shell script,so I need you help ,thank you 

這讀取words文件,並將它們全部詞語的數組words[]。然後,它會遍歷input中的行,並刪除出現在數組words[]中的那些單詞。

+1

問題解決了!非常感謝 。順便說一句,awk太棒了。 – pffy233

+0

我同意!如果你想進一步學習'awk'知識,我建議你通過[習語awk](http://backreference.org/2010/02/10/idiomatic-awk/)。那裏有很多樂趣:) – fedorqui

2

這應該有助於

#!/bin/bash 

cat inputfile | while read line 
do 
     sed -i "s/$line//g" input 
done 

凡inputfile中含有的話,除去 並輸入你想從

+0

我沒有看到你在哪裏閱讀的話。我測試了[對我],它不起作用。 – fedorqui

+0

「cat inputfile」是一個正在閱讀的文字 –

0

只需

while read word; do 
    sed "s/$word//g" input > output # Output to other file 
done < words_file 

while read word; do 
    sed -i "s/$word//g" input   # In place edit 
done < words_file 
刪除文件
+1

不要在''cat words ...'中說'for word'......'''。只要說'一邊讀......一邊; ...;完成 fedorqui

+0

@fedorqui更新了,但反正沒有錯。 – Shreevardhan

+1

這沒有錯,但它可能會導致不良行爲。用'for $(cat)'來讀取所有文件,而'while ... done output'將會中斷,因爲您將一直讀取同一個文件,所以一個鏡頭中的更改將在下一個文件中消失。 – fedorqui

相關問題