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次に、ループの標準入力を引き継ぎ、ファイル内の他の 2 行を読み取ります (したがって、ループは 1 回の反復のみを実行します)。

注釈付きのループ:

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。この理由は説明しましたそこにはなぜ他の 2 つの値が印刷されるのか疑問に思います。

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

関連情報