shell中循环的文件重定向

时间:2016-04-06 11:09:23

标签: shell awk stdin io-redirection

我试图理解shell的文件重定向是如何在shell中工作的,所以我编写了以下代码:

#!/bin/sh
while IFS='' read -r line; do
  echo 'reading '$line
  awk -F, '{sub(/.*/,"Completed",$2);print}'
done<$1

我将以下输入文件提供给脚本:

hello,hi,how are you
i,am,good

在上述文件上运行脚本的输出是:

reading hello,hi,how are you
i Completed good

我期待输出格式:

reading hello,hi,how are you
hello,Completed,how are you
i Completed good
reading i,am,good
hello,Completed,how are you
i Completed good

为什么循环不打印两行的“读数”?而且,为什么替换awk没有发生在第一线?有人可以解释一下脚本的输出吗?

1 个答案:

答案 0 :(得分:1)

您只能在循环中重定向一个stdinreadawk都将从stdin中读取。虽然read只占用一行(第一行),但awk很乐意消耗剩余的一行。

在下一次迭代中,read没有其他内容可读,循环终止。

如果您想提供awk的标准输入数据,您必须明确地这样做,例如:通过awk汇总到printf '%s\n' "$line" | awk ...