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
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
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.awk '{if ($2==0){print "equal"}else{print "not"}}' file.txt
?while
…done
bucle. Es decir:is
x4