ループを読みながら

ループを読みながら

以下のファイルがあります

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

関連情報