während der Leseschleife

habe ich eine Datei wie die folgende

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

Dann habe ich Diese while-Leseschleife, um eine der Spalten mit einer Zahl zu vergleichen, gibt dann etwas wieder. Anstatt jedoch meine gewünschte Phrase wiederzugeben, wird etwas anderes wiedergegeben.

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

Anstatt das Obige wiederzugeben, wird die 2. Spalte der Datei wiedergegeben.

Kommentare

  • Ich kann ' das Problem nicht tatsächlich reproduzieren, wenn das Skript so ausgeführt wird, wie es ist, aber in In jedem Fall haben Sie andere Probleme mit Ihrem Skript. Hauptsächlich machen Sie read num und erwarten, dass das Ergebnis eine einzelne Zahl ist (die Sie mit der Zeichenfolge " 0 ), aber Sie lesen tatsächlich eine Eingabedatei mit 4 Spalten, sodass $num eine Zeichenfolge mit 4 Spalten ist.
  • Nicht getestet, aber ich denke, Ihr Problem ist, dass die Pipe nach der while-Schleife fertig wird? Wie auch immer, warum nicht alle in awk: awk '{if ($2==0){print "equal"}else{print "not"}}' file.txt?
  • Wie dargestellt, würde dieses Code-Snippet das zweite Wort aus jeder Zeile drucken, die von … done Schleife. Dh: is x4

Antwort

Sie sollten

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 

für eine gemischte awk / bash-Lösung.

Wie andere bereits erwähnt haben, erfolgt die awk-Umleitung später.

Antwort

Es sieht so aus, als würden Sie versuchen, die Ausgabe von home/dir/file.txt | awk "{print $2}" auf die while Schleife;

zuerst denke ich, dass der richtige Pfad /home/dir/file.txt sein sollte (dies ist jedoch nur eine Annahme);

Sekunde /home/dir/file.txt | awk "{print $2}" leitet den Inhalt von /home/dir/file.txt nicht an awk um Während < /home/dir/file.txt awk "{print $2}" dies tut;

drittens leiten Sie die Ausgabe des Befehls als Datei um, aber es ist eine Zeichenfolge, und Sie sollten sie als umleiten it: <<< "$(< /home/dir/file.txt awk "{print $2}")".

Alternativ können Sie die Ausgabe des Befehls auch direkt an die while -Schleife weiterleiten stattdessen: .

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

oder

 < /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  

Antwort

Da ich nicht kommentieren kann, frage ich mich nur, warum die Leute IFS nicht verwendet haben

 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 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.