如何将输出传递awk
给for file in
循环?
for file in awk '{print $2}' my_file; do echo $file done;
my_file
包含应显示(回显)其名称的文件的名称。
我得到一个
>
而不是我的正常提示。
要使用的符号是$(...)
或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
。外壳仍在等待done
. 如果你输入done
并返回,你会看到输出:
awk done
{print $2} done
my_file done
$(awk ...)
对于少量文件,使用反引号或用于命令替换是可接受的解决方案;但是,请考虑将 xargs 用于单个命令或管道,或者将 simplewhile read ...
用于更复杂的任务(但它也适用于简单的任务)
awk '...' |while read FILENAME; do
#do work with each file here using $FILENAME
done
这将允许在处理每个文件名时完成处理,而不必等待整个 awk 脚本完成并允许更大的文件名集(您只能为 a 提供这么多参数for x in ...; do
)这通常会加快您的脚本并允许您在for in
没有限制的情况下循环执行相同类型的操作。
for file in $(awk '{print $2}' my_file); do echo "$file"; done
使用反引号或$(...)
替换命令的输出:
for file in $(awk '{print $2}' my_file)
do
echo "$file"
done