Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Awk 而循环只迭代一次_Awk_While Loop_Grep - Fatal编程技术网

Awk 而循环只迭代一次

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

我正在编写一个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 
“文件”看起来像

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