while read loop (Português)

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

  • Não posso ' realmente reproduzir o problema ao executar o script como está, mas em em qualquer caso, você tem outros problemas com seu script. Principalmente, você faz 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.
  • Não testei, mas acho que seu problema é que o pipe ficará pronto após o loop while? De qualquer forma, por que não todos em awk: awk '{if ($2==0){print "equal"}else{print "not"}}' file.txt?
  • Conforme apresentado, esse trecho de código imprimiria a segunda palavra de cada linha produzida pelo whiledone loop. Ou seja: is x4

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 

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *