Bash でファイルを一行ずつ読み込む方法

Bash では、ファイルに保存されているデータを一行ずつ処理しなければならない状況にいくつか直面することがあります。このような場合、ファイルの内容を読み込む必要がある。ファイルを一行ずつ読み込むには、Bash の read コマンドを使う。

Bash でファイルを一行ずつ読む

構文

while IFS= read -r line
do
  echo "$line"
done < file_name

ファイル file_name の内容を 1 行ずつ読み込み、ターミナルに 1 行ずつ表示する。ループはファイルの最後に到達するまで実行される。IFS はヌル文字列に設定されており、先頭と末尾の空白を保持するのに役立ちます。

あるいは、上記のコマンドを 1 行内で以下のコマンドに置き換えることもできます。

while IFS= read -r line; do echo $line; done < file_name

例: Bash でファイルを一行ずつ読み込む

この例では、各行に数字を含むファイル file.txt を読み込んで、ファイル内のすべての数字の和を求める。

file.txt の内容

1
5
6
7
8
10
#!/bin/bash

sum=0
echo "The numbers in the file are:"
while IFS= read -r line
do
  echo "$line"
  sum=$(( $sum + $line ))
done < file.txt
echo "The sum of the numbers in the file is:$sum"

出力:

The numbers in the file are:
1
5
6
7
8
The sum of the numbers in the file is:27

これは file.txt という名前のファイルから一行ずつ数値を読み込んで、それらの数値を合計し、最後にその合計をエコーで出力します。

例:ファイル内のフィールドを変数に設定する

複数の変数を read コマンドに渡すことで、ファイル内のフィールドを変数に設定することができる。

file.txt の内容

Rohit-10
Harish-30
Manish-50
Kapil-10
Anish-20
#!/bin/bash

while IFS=- read -r name earnings
do
    echo "$name" has made earnings of "$earnings" pounds today!
done < file.txt

出力:

Rohit has made earnings of 10 pounds today!
Harish has made earnings of 30 pounds today!
Manish has made earnings of 50 pounds today!
Kapil has made earnings of 10 pounds today!

ここでは、2つの変数を read コマンドに渡しているので、ファイルの各行は 2つのセグメントに分割されています。最初のセグメントは行頭から最初の - までの name 変数に代入され、残りの部分は earnings 変数に代入されます。

Bash でファイルを読み込む別の方法

#!/bin/bash

while IFS=- read -r name earnings
do
    echo "$name" has made earnings of "$earnings" pounds today!
done < <(cat file.txt )

出力:

Rohit has made earnings of 10 pounds today!
Harish has made earnings of 30 pounds today!
Manish has made earnings of 50 pounds today!
Kapil has made earnings of 10 pounds today!

ここでは、cat コマンドの出力として file.txt というファイル名がプログラムに渡される。

comments powered by Disqus