bash while loop não imprime o que é esperado

bash while loop não imprime o que é esperado

Estou tentando esse whileloop simples no bash.

Meu arquivo de texto

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

Meu roteiro

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

Saída

# ./test1.sh
25
27

A saída não está imprimindo o $2valor da primeira linha. Alguém poderia me ajudar a entender esse caso?

Responder1

Você não precisa desse loop:

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

awkprocessará a entrada linha por linha.


Com o seu loop, readobterá a primeira linha do arquivo, que é perdida porque não é usada/emitida. O awkirá então assumir a entrada padrão do loop e ler as outras duas linhas no arquivo (portanto, o loop fará apenas uma única iteração).

Seu loop, anotado:

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

Responder2

Consegui corrigir seu código adicionando echo. A razão para isso foi descrita, questione por que está imprimindo outros dois valores.

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

Responder3

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

ou

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

informação relacionada