以下のファイルがあります
var 3 2014 string
var1 4 2011 string4
var2 6 1999 string2
var3 1 2016 string6
次に、列の1つを数値と比較してから何かをエコーする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}'
上記の内容をエコーするのではなく、ファイルの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
(しかしこれは単に仮説にすぎません)。
2番目は/home/dir/file.txt | awk '{print $2}'
コンテンツ/home/dir/file.txt
をにリダイレクトしませんが、awk
中には< /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