我有一个如下所示的文件
var 3 2014 string
var1 4 2011 string4
var2 6 1999 string2
var3 1 2016 string6
然后我有这个 while read 循环来将其中一列与数字进行比较,然后回显某些内容。然而,它并没有回应我想要的短语,而是回应了其他的东西。
while read num
do
if [ "$num" = "0" ]; then
echo "Number is equal to zero"
else
echo "number is not equal to 0"
fi
done < home/dir/file.txt | awk '{print $2}'
它不是回显上面的内容,而是回显文件的第二列。
答案1
你应该试试
awk '{print $2}' home/dir/file.txt | while read num
do
if [ "$num" = "0" ]; then
echo "Number is equal to zero"
else
echo "number is not equal to 0"
fi
done
混合 awk/bash 解决方案。
正如其他人指出的那样,awk 重定向稍后发生。
答案2
因为我无法发表评论,只是想知道为什么人们没有使用 IFS
while IFS=" " read var num year string
do
if [[ $num -eq 0 ]]; then
echo "Number is equal to zero"
else
echo "number is not equal to 0"
fi
done < home/dir/file.txt
答案3
看起来您正在尝试将 的输出重定向home/dir/file.txt | awk '{print $2}'
到while
循环;
首先我猜正确的路径应该是/home/dir/file.txt
(但这只是一个假设);
Second/home/dir/file.txt | awk '{print $2}'
不会将内容重定向/home/dir/file.txt
到 to awk
,而 while< /home/dir/file.txt awk '{print $2}'
会;
第三,您将命令的输出重定向为文件,但它是一个字符串,您应该将其重定向为:<<< "$(< /home/dir/file.txt awk '{print $2}')"
。
另外,您也可以将命令的输出直接通过管道传输到while
循环< /home/dir/file.txt awk '{print $2}' | while read num
:
while read num
do
if [ "$num" = "0" ]; then
echo "Number is equal to zero"
else
echo "number is not equal to 0"
fi
done <<< "$(< /home/dir/file.txt awk '{print $2}')"
或者
< /home/dir/file.txt awk '{print $2}' | while read num
do
if [ "$num" = "0" ]; then
echo "Number is equal to zero"
else
echo "number is not equal to 0"
fi
done