Awk 而循环只迭代一次
我正在编写一个unix脚本,它执行awk并将管道连接到while循环。然而,出于某种原因,while循环只迭代一次。有人能指出我遗漏了什么吗Awk 而循环只迭代一次,awk,while-loop,grep,Awk,While Loop,Grep,我正在编写一个unix脚本,它执行awk并将管道连接到while循环。然而,出于某种原因,while循环只迭代一次。有人能指出我遗漏了什么吗 awk '{ print $1, $2}' file | while IFS=" " read A B do echo $B if [ "$B" -eq "16" ]; then grep -A 1 $A $1 | python unreverse.py else grep -A 1 $A fi done “文件”看起来像 chees
awk '{ print $1, $2}' file |
while IFS=" " read A B
do
echo $B
if [ "$B" -eq "16" ];
then
grep -A 1 $A $1 | python unreverse.py
else
grep -A 1 $A
fi
done
“文件”看起来像
cheese 2
elephant 5
tiger 16
解决方案
解决方案是替换:
grep -A 1 $A
与:
其中filename
是您想要从中读取的任何文件grep
。只是猜测,也许你有意:
grep -A 1 "$A" "$1"
我添加了双引号以防止任何可能的分词
解释
问题是,如果没有文件名,grep
命令读取并使用所有标准输入。它在循环的第一次运行中就这样做了。因此,第二次运行没有剩余的输入,readabb
失败,循环终止
一个简单的例子
我们可以看到同样的问题发生在更少的声明中。这是一个while循环,它有两行输入,但只循环一次:
$ { echo 1; echo 2; } | while read n; do grep "$n"; echo "n=$n"; done
n=1
在这里,只需向grep
语句添加一个文件名,我们就可以看到while
循环执行两次,正如它应该执行的那样:
$ { echo 1; echo 2; } | while read n; do grep "$n" /dev/null; echo "n=$n"; done
n=1
n=2
我确信所有这些都可以在一个
awk
中完成,不需要额外的bash
循环。你能列出你所有的文件和它们包含的内容,以及你想从中得到什么吗。
$ { echo 1; echo 2; } | while read n; do grep "$n" /dev/null; echo "n=$n"; done
n=1
n=2