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