bash while цикл не печатает то, что ожидалось

bash while цикл не печатает то, что ожидалось

Я пробую этот простой whileцикл в bash.

Мой текстовый файл

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

Мой сценарий

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

Выход

# ./test1.sh
25
27

Вывод не печатает $2значение первой строки. Может ли кто-нибудь помочь мне разобраться в этом случае?

решение1

Вам не нужен этот цикл:

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

awkбудет обрабатывать ввод построчно.


С вашим циклом, readполучит первую строку файла, которая будет потеряна, так как она не используется/не выводится. awkЗатем возьмет на себя стандартный ввод цикла и прочитает две другие строки в файле (поэтому цикл выполнит только одну итерацию).

Ваш цикл, аннотированный:

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

решение2

Я смог исправить ваш код, добавив echo. Причина этого описанатам, задайте вопрос, почему он печатает два других значения.

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

решение3

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

или

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

Связанный контент