while read loop (日本語)

次のようなファイルがあります

var 3 2014 string var1 4 2011 string4 var2 6 1999 string2 var3 1 2016 string6 

次にこのwhile読み取りループは、列の1つを数値と比較してから、何かをエコーします。ただし、目的のフレーズをエコーする代わりに、別のフレーズをエコーします。

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番目の列をエコーします。

コメント

  • スクリプトをそのまま実行すると、'実際に問題を再現することはできませんが、スクリプトに他の問題がある場合。主に、read numを実行し、結果が単一の数値になることを期待します(これを文字列" 0 )ですが、実際には4列の入力ファイルを読み取っているため、$numは4列の文字列になります。
  • テストされていませんが、あなたの問題は、パイプがwhileループの後に行われることだと思いますか?とにかく、なぜすべてがawkではないのですか:awk '{if ($2==0){print "equal"}else{print "not"}}' file.txt
  • 提示されているように、そのコードスニペットは … doneループ。つまり、is x4

回答

試してみてください

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リダイレクトは後で発生します。

回答

home/dir/file.txt | awk "{print $2}"の出力を

ループ;

最初に、正しいパスは/home/dir/file.txtである必要があると思います(ただし、これは単なる仮定です)。

second /home/dir/file.txt | awk "{print $2}"/home/dir/file.txtのコンテンツをawkにリダイレクトしません、< /home/dir/file.txt awk "{print $2}"は行います;

3番目に、コマンドの出力をファイルとしてリダイレクトしますが、それは文字列であるため、次のようにリダイレクトする必要があります。 it:<<< "$(< /home/dir/file.txt awk "{print $2}")"

または、コマンドの出力をwhileループに直接パイプすることもできます。代わりに:。

 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  

回答

コメントできないので、なぜ人々は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 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です