0

如何将输出传递awkfor file in循环?

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

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

我得到一个

>

而不是我的正常提示。

4

4 回答 4

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。外壳仍在等待done. 如果你输入done并返回,你会看到输出:

awk done
{print $2} done
my_file done
于 2013-11-03T17:03:23.987 回答
1

$(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没有限制的情况下循环执行相同类型的操作。

于 2013-11-03T19:09:23.723 回答
1
for file in $(awk '{print $2}' my_file); do echo "$file"; done
于 2013-11-03T17:02:02.763 回答
1

使用反引号或$(...)替换命令的输出:

for file in $(awk '{print $2}' my_file)
do
    echo "$file"
done
于 2013-11-03T17:02:11.080 回答