次のようなファイルがあります
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番目の列をエコーします。
コメント
回答
試してみてください
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
read num
を実行し、結果が単一の数値になることを期待します(これを文字列" 0 )ですが、実際には4列の入力ファイルを読み取っているため、$num
は4列の文字列になります。awk '{if ($2==0){print "equal"}else{print "not"}}' file.txt
?done
ループ。つまり、is
x4