如何将awk
的输出传递给for file in
循环?
for file in awk '{print $2}' my_file; do echo $file done;
my_file
包含应显示其名称(回显)的文件的名称。
我只是一个
>
而不是我的正常提示。
答案 0 :(得分:1)
for file in $(awk '{print $2}' my_file); do echo "$file"; done
答案 1 :(得分:1)
使用反引号或$(...)
替换命令的输出:
for file in $(awk '{print $2}' my_file)
do
echo "$file"
done
答案 2 :(得分:1)
使用的表示法是$(...)
或Command Substitution。
for file in $(awk '{print $2}' my_file)
do
echo $file
done
我假设你在循环体中做的比echo
更多,因为你可以完全抛弃循环:
awk '{print $2}' my_file
或者,如果您错过了输入分号并且不想将代码分布在多行上以便于阅读,那么您可以使用:
for file in $(awk '{print $2}' my_file); do echo $file; done
您还可以在(通常是较旧的)代码中找到使用的反引号:
for file in `awk '{print $2}' my_file`
do
echo $file
done
除了难以在用于格式化Stack Overflow上的注释(以及问题和答案)的Markdown中使用时,反引号也不那么友好,尤其是在嵌套时,所以你应该识别它们并理解它们但不要使用它们
顺便提一下,你得到>
提示符的原因是这个命令行:
for file in awk '{print $2}' my_file; do echo $file done;
在done
之前缺少分号。 shell仍在等待done
。如果你键入done
并返回,你会看到输出:
awk done
{print $2} done
my_file done
答案 3 :(得分:1)
对于少量文件,使用反引号或$(awk ...)
进行命令替换是可接受的解决方案;但是,考虑对单个命令或管道使用xargs,或者对于更复杂的任务使用简单的while read ...
(但它也适用于简单的任务)
awk '...' |while read FILENAME; do
#do work with each file here using $FILENAME
done
这将允许在处理每个文件名时完成处理,而不必等待整个awk脚本完成并允许更大的文件名集(您只能为for x in ...; do
提供这么多的args这通常会加快脚本的速度,并允许在for in
循环中进行相同类型的操作,而不受其限制。