while read loop (Français)

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

  • Je peux ' reproduire le problème lors de lexécution du script tel quel, mais en dans tous les cas, vous rencontrez dautres problèmes avec votre script. Surtout, vous faites 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.
  • Pas testé, mais je pense que votre problème est que le tuyau sera fait après la boucle while? Quoi quil en soit, pourquoi pas tout dans awk: awk '{if ($2==0){print "equal"}else{print "not"}}' file.txt?
  • Tel que présenté, cet extrait de code afficherait le deuxième mot de chaque ligne produite par le … done. Ie: is x4

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 

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *