web-dev-qa-db-ja.com

読み取りループ中

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

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

次に、このwhile readループを使用して、列の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列目をエコーし​​ます。

7
kickass13

試してみてください

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

5
Archemar

_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}'_はリダイレクトします。

3番目に、コマンドの出力をファイルとしてリダイレクトしていますが、これは文字列であり、<<< "$(< /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
_
3
kos

私はコメントできないので、疑問に思って、なぜ人々がIFSを使用しなかったのか

 while IFS = "" read var num year string 
 do 
 if [[$ num -eq 0]]; then 
 echo "番号がゼロに等しい" 
 else 
 echo "番号が0に等しくない
 fi 
 done <home/dir /file.txt
3
rebelution