while read loop (Italiano)

Ho un file come quello sotto

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

Allora ho questo ciclo while read per confrontare una delle colonne con un numero e poi echeggiare qualcosa. Tuttavia, invece di riecheggiare la mia frase desiderata, fa eco qualcosaltro.

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

invece di echeggiare quanto sopra, fa eco alla seconda colonna del file.

Commenti

  • Non posso ' riprodurre effettivamente il problema quando eseguo lo script così comè, ma in in ogni caso hai altri problemi con il tuo script. Principalmente, fai read num e ti aspetti che il risultato sia un singolo numero (che confronti con la stringa " 0 "), ma stai effettivamente leggendo un file di input con 4 colonne, quindi $num sarà una stringa con 4 colonne.
  • Non testato, ma penso che il tuo problema sia che il pipe verrà fatto dopo il ciclo while? Ad ogni modo, perché non tutti in awk: awk '{if ($2==0){print "equal"}else{print "not"}}' file.txt?
  • Come presentato, quello snippet di codice stamperà la seconda parola di ogni riga prodotta da whiledone loop. Ad esempio: is x4

Risposta

dovresti provare

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 

per una soluzione mista awk / bash.

Come altri hanno sottolineato, il reindirizzamento awk si verifica più tardi.

Risposta

Sembra che tu “stia cercando di reindirizzare loutput di home/dir/file.txt | awk "{print $2}" al while loop;

per prima cosa immagino che il percorso corretto dovrebbe essere /home/dir/file.txt (tuttavia questo è solo un presupposto);

secondo /home/dir/file.txt | awk "{print $2}" non “reindirizza il contenuto di /home/dir/file.txt a awk , mentre < /home/dir/file.txt awk "{print $2}" fa;

terzo, stai “reindirizzando loutput del comando come un file, ma” è una stringa e dovresti reindirizzarlo come it: <<< "$(< /home/dir/file.txt awk "{print $2}")".

Inoltre, in alternativa, puoi reindirizzare loutput del comando direttamente al ciclo while invece: .

 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  

Risposta

Dato che non posso commentare, mi chiedo solo perché le persone non hanno usato 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 

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *