2016-07-27 45 views
0

我想下面的命令:AWK在while循環中不能正常工作

while read file 
do 
awk -v ID="$file" '$1==ID{print $0}' input2 > output 
done < input1 

輸入1看起來是這樣的:

1 
2 
3 
4 

輸入2看起來是這樣的:

2 a b c 
3 a b c 
5 a b c 
6 a b c 

輸出應看起來像這樣:

3 a b c 

所以,換句話說,如果文件input2的第一列與來自文件input1的值中的一個相匹配,我希望從input2的整行打印輸出。我從上面的while循環只產生空文件然而......可能是什麼問題?非常感謝! >>

回答

2

輸出在每次迭代 使用破壞,而不是>或僅最後一次迭代顯示

+0

啊當然,謝謝! – Abdel

3

不要那樣做,這是非常低效和脆弱(見https://unix.stackexchange.com/questions/169716/why-is-using-a-shell-loop-to-process-text-considered-bad-practice)。這樣做代替:

awk 'NR==FNR{ids[$0];next} $1 in ids' input1 input2 > output 
+1

+1!直到最近我還以爲awk只能處理一個輸入文件。我認爲大多數人也忽略了這一點,因此「讀」結構。 –

+0

是的,不幸的是,許多人認爲awk只是一個花哨的grep或sed。但遠不止這些 - 它是**標準的UNIX通用文本處理工具。我總是建議任何可能需要在UNIX上操作文本的人先閱讀由Arnold Robbins編寫的第4版Effective Awk Programming。它可能會改變遊戲規則。 –

+0

當然,雖然現在我們已經有了python,但它已經變得有點古老了。順便說一句,你可以解釋你的oneliner?如果人們瞭解它的工作原理,人們會多使用多個輸入流。 –