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 este while read loop para comparar uma das colunas a um número e, em seguida, ecoar algo. No entanto, em vez de ecoar minha frase desejada, ele 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 2ª coluna do arquivo.
Comentários
Resposta
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 awk / bash mista.
Como outros apontaram, o redirecionamento do awk ocorre mais tarde.
Resposta
Parece que você está tentando redirecionar a saída de home/dir/file.txt | awk "{print $2}" para 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 deve redirecioná-la como it: <<< "$(< /home/dir/file.txt awk "{print $2}")".
Além disso, como alternativa, você pode canalizar a saída do comando diretamente para o loop while em vez disso: .
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
Resposta
Já que não posso comentar, estou apenas pensando, 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
read nume espera que o resultado seja um único número (que você compara com a string " 0 "), mas na verdade você está lendo um arquivo de entrada com 4 colunas, então$numserá uma string com 4 colunas.awk '{if ($2==0){print "equal"}else{print "not"}}' file.txt?while…doneloop. Ou seja:isx4