durante o loop de leitura

4

Eu tenho um arquivo como o abaixo

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

Então eu tenho isso enquanto lê o loop para comparar uma das colunas com um número, em seguida, ecoar algo. No entanto, em vez de repetir minha frase desejada, ela ecoa outra coisa.

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}' 

em vez de ecoar o acima, ele ecoa a segunda coluna do arquivo.

    
por kickass13 11.06.2015 / 09:13

3 respostas

4

você deve tentar

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 

para uma solução mista de awk / bash.

Como outros apontaram, o redirecionamento do awk ocorre mais tarde.

    
por 11.06.2015 / 09:46
2

Parece que você está tentando redirecionar a saída de home/dir/file.txt | awk '{print $2}' para o while loop;

primeiro, acho que o caminho correto deve ser /home/dir/file.txt (no entanto, isso é apenas uma suposição);

segundo /home/dir/file.txt | awk '{print $2}' não redireciona o conteúdo de /home/dir/file.txt para awk , enquanto < /home/dir/file.txt awk '{print $2}' faz;

terceiro, você está redirecionando a saída do comando como um arquivo, mas é uma string, e você deve redirecioná-la da seguinte forma: <<< "$(< /home/dir/file.txt awk '{print $2}')" .

Além disso, você pode enviar a saída do comando diretamente para o loop 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}')"

ou

< /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
    
por 11.06.2015 / 09:48
0

Desde que eu não posso comentar, apenas me perguntando por que as pessoas não usaram o 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
    
por 11.01.2018 / 14:14