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 num
e 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$num
será uma string com 4 colunas.awk '{if ($2==0){print "equal"}else{print "not"}}' file.txt
?while
…done
loop. Ou seja:is
x4