Bash While-Schleife druckt nicht das, was erwartet wird

Bash While-Schleife druckt nicht das, was erwartet wird

Ich versuche diese einfache whileSchleife in Bash.

Meine Textdatei

# cat test.txt
line1:21
line2:25
line5:27
These are all on new line

Mein Skript

# cat test1.sh
while read line
do
        awk -F":" '{print $2}'
done < test.txt

Ausgabe

# ./test1.sh
25
27

Die Ausgabe druckt nicht den $2Wert der ersten Zeile. Kann mir bitte jemand helfen, diesen Fall zu verstehen?

Antwort1

Sie brauchen diese Schleife nicht:

$ awk -F ':' '{ print $2 }' test.txt
21
25
27

awkverarbeitet die Eingabe zeilenweise.


Mit Ihrer Schleife readholt sich der die erste Zeile der Datei, die verloren geht, da sie nicht verwendet/ausgegeben wird. Der awkübernimmt dann die Standardeingabe der Schleife und liest die anderen beiden Zeilen in der Datei (die Schleife führt also immer nur eine einzige Iteration aus).

Ihre Schleife, kommentiert:

while read line                # first line read ($line never used)
do
    awk -F ':' '{ print $2 }'  # reads from standard input, which will
                               # contain the rest of the test.txt file
done <test.txt

Antwort2

Ich konnte Ihren Code reparieren, indem ich hinzufügte echo. Der Grund dafür ist beschriebenDort, Frage, warum zwei andere Werte gedruckt werden.

while read line;
do
        echo "$line" | awk -F":" '{print $2}'
done < test.txt

Antwort3

while IFS=":" read z x; do 
  echo $x; 
done<test.txt

oder

sed "s/^.*://g" test.txt

verwandte Informationen