11
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【シェルスクリプト】ファイルを1行ずつ読み込んで処理する方法

Posted at

while read文を使って次のようにするとテキストファイルを1行ずつ読み込んでなんやかんやすることができます。(Solarisではこの書き方はできないようですが、あまり使われていないOSですので考慮しなくても良いと思います。)

#!/bin/bash

FILE_NAME=/fuga/hoge/fizz.txt
while read LINE
do
# コマンド
done < ${FILE_NAME}

while文に${FILE_NAME}をリダイレクトするとreadコマンドで${FILE_NAME}の中身を1行ずつ読み込んでLINEという変数に格納します。(変数名はLINEでなくても問題ありません。)

このようなコードを使うと「3カラム目の値がfizzである行を判別してうんたらかんたらする」みたいなことができます。

注意点と回避策

while文の末尾でリダイレクトする都合上「どのファイルを読み込んでいるのか」ということが上からシェルスクリプトを読んでいくと分かりづらいので、while文の上にコメントで「このファイルを読み込みます」ということを書き添えておくと良いと思います。


FILE=/hoge/fuga.txt

# FILEを読み込んで処理
while read LINE
# コマンド
done < "${FILE}"

for文ではファイルを1行ずつ読み込めない

私は当初for文で上記の処理を実現しようとして次のようなコードを書いていました。


FILE=/hoge/fuga.txt
# これは動かない
for LINE in "${FILE}"
do
# コマンド
done

結果から言うとこのコードは動きませんでした。
ディレクトリを読み込んでファイルを1つずつ処理することができたので、その延長線上で考えてファイルを1行ずつ処理することもできるやろ、程度に考えてしまいました。


# ディレクトリ内にあるファイルを1つずつ読み込む
# これは動く
for FILE in /usr/local/hoge/*
do
  echo $FILE
done

ファイルを1行ずつ読み込む場合は **「while read line」**と覚えると良いでしょう。

11
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?