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