awk - while 循环只迭代一次

标签 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 

"file"看起来像

cheese 2
elephant 5
tiger 16

最佳答案

解决方案

解决方案是更换:

grep -A 1 $A

与:

grep -A 1 "$A" filename

filename 是您希望 grep 从中读取的任何文件。只是猜测,也许你打算:

grep -A 1 "$A" "$1"

我添加了双引号以防止任何可能的分词。

说明

问题是,如果没有文件名,grep 命令会读取并使用所有标准输入。它在第一次运行循环时执行此操作。因此,第二次运行没有剩余输入,read A B 失败,循环终止。

一个更简单的例子

我们可以看到同样的问题发生在更少的语句上。这是一个 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 - while 循环只迭代一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28133426/

相关文章:

java - 错误 : unreported exception java. io.IOException;必须被捕获或宣布被扔出

javascript - 在 while 循环中使用 -- 运算符会产生意想不到的结果

Bash - 根据索引列表中未列出的索引从文件中提取行

Git 搜索所有差异

awk 与条件的比较

python - 错误的命名链接搜索和替换

r - 如何避免在 while 循环之外编码第一次迭代

ubuntu - 在 Ubuntu 18.04 上递归查找和重新定位

linux - 如何删除一行中某个字符后的所有文本,并在每一行上执行相同的操作?

Linux:使用文件中的一个记录实例提取值