使用awk的输出作为for循环中的名称列表

时间:2013-11-03 16:59:55

标签: bash awk

如何将awk的输出传递给for file in循环?

for file in awk '{print $2}' my_file; do echo $file done;

my_file包含应显示其名称(回显)的文件的名称。

我只是一个

>

而不是我的正常提示。

4 个答案:

答案 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循环中进行相同类型的操作,而不受其限制。