2016-07-27 81 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?如果人们了解它的工作原理,人们会多使用多个输入流。 –