Jai un fichier comme celui ci-dessous
var 3 2014 string var1 4 2011 string4 var2 6 1999 string2 var3 1 2016 string6
Alors jai cette boucle while read pour comparer lune des colonnes à un nombre puis faire écho à quelque chose. Cependant, au lieu de faire écho à ma phrase souhaitée, cela fait écho à autre chose.
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}"
au lieu de faire écho à ce qui précède, il fait écho à la deuxième colonne du fichier.
Commentaires
Réponse
vous devriez essayer
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
pour une solution mixte awk / bash.
Comme dautres lont souligné, la redirection awk se produit plus tard.
Réponse
Il semble que vous « essayez de rediriger la sortie de home/dir/file.txt | awk "{print $2}"
vers le while
loop;
Dabord, je suppose que le chemin correct devrait être /home/dir/file.txt
(mais ce nest quune hypothèse);
La seconde /home/dir/file.txt | awk "{print $2}"
ne redirige pas le contenu de /home/dir/file.txt
vers awk
, tandis que < /home/dir/file.txt awk "{print $2}"
le fait;
troisièmement, vous « redirigez la sortie de la commande sous forme de fichier, mais cest » une chaîne, et vous devez la rediriger comme it: <<< "$(< /home/dir/file.txt awk "{print $2}")"
.
Vous pouvez également diriger la sortie de la commande directement vers la boucle while
à la place: .
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
Réponse
Puisque je ne peux pas « t commenter, je me demande simplement pourquoi les gens nont pas utilisé 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
et vous vous attendez à ce que le résultat soit un seul nombre (que vous comparez à la chaîne " 0 "), mais vous lisez en fait un fichier dentrée avec 4 colonnes donc$num
sera une chaîne de 4 colonnes.awk '{if ($2==0){print "equal"}else{print "not"}}' file.txt
?done
. Ie:is
x4