while read loop (Español)

Tengo un archivo como el siguiente

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

Entonces tengo esto mientras lee el ciclo para comparar una de las columnas con un número y luego repite algo. Sin embargo, en lugar de repetir mi frase deseada, se hace eco de otra cosa.

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

en lugar de repetir lo anterior, se hace eco de la segunda columna del archivo.

Comentarios

  • No puedo ' reproducir el problema al ejecutar el script tal cual, pero en en cualquier caso, tiene otros problemas con su script. Básicamente, hace read num y espera que el resultado sea un solo número (que compara con la cadena " 0 "), pero en realidad estás leyendo un archivo de entrada con 4 columnas, por lo que $num será una cadena con 4 columnas.
  • No probado, pero creo que su problema es que la tubería se realizará después del ciclo while. De todos modos, ¿por qué no todo en awk: awk '{if ($2==0){print "equal"}else{print "not"}}' file.txt?
  • Tal como se presenta, ese fragmento de código imprime la segunda palabra de cada línea producida por whiledone bucle. Es decir: is x4

Respuesta

deberías probar

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 una solución mixta de awk / bash.

Como otros han señalado, la redirección de awk ocurre más tarde.

Respuesta

Parece que «estás intentando redirigir la salida de home/dir/file.txt | awk "{print $2}" al while loop;

Primero, supongo que la ruta correcta debería ser /home/dir/file.txt (sin embargo, esto es solo una suposición);

segundo /home/dir/file.txt | awk "{print $2}" no «redirige el contenido de /home/dir/file.txt a awk , mientras que < /home/dir/file.txt awk "{print $2}" lo hace;

tercero, está redirigiendo la salida del comando como un archivo, pero es una cadena, y debe redirigirlo como it: <<< "$(< /home/dir/file.txt awk "{print $2}")".

Además, como alternativa, puede canalizar la salida del comando directamente al bucle while en su lugar: .

 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}")"  

o

 < /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  

Respuesta

Como no puedo comentar, me pregunto por qué la gente no ha usado 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 

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *