シェルプログラミング - while

はじめに

ファイルを1行づつ読込んで処理する場合はwhileを使います。forでは出来ないと思っていて大丈夫です。

文法

基本的に以下のようなコードになるのですが、上から見ていたので「入力がない??」になってしまいました。

while read XXXX
  # 何かしたいこと
done < YYYYY

「done < YYYYY」まで見てやっと「< YYYYY」のリダイレクトが入力だと理解出来ました。

せめて「while」の前にコメントでもあったらよかったのですが…
あたりまえ過ぎてコメント書くと「じゃま」なんでしょうね。

以降、やっと「ファイルの1行づつの読込み」についての話になります。

ファイルを1行づつの読込み処理を行う

読込み用の「data.txt」を用意します。
※最終行は空行を入れておきます。これをしないと、「最終行が読み込まれない」という現象に遭遇します。

AAA.txt 1
BBB.txt 2
CCC.txt 3

以下のShellで読込みます。

# 最終行に空行が存在する必要があります
FILE_NAME="./data.txt"

while read LINE
do
    echo ${LINE}
done < ${FILE_NAME}

----- OUTPUT -----
AAA.txt 1
BBB.txt 2
CCC.txt 3

最終行が空行の場合

最終行が空行の場合も考えると…
以下のコードで対応できます。

FILE_NAME="./data.txt"

while read LINE || [ -n "${LINE}" ]
do
  echo ${LINE}
done < ${FILE_NAME}

1行が複数のフィールドの場合 その1

1行が複数のフィールドからなる場合は、以下のようにすることが出来ます。

# 最終行に空行が存在する必要があります
FILE_NAME="./data.txt"

while read WK_NAME WK_NO
do
    echo ${WK_NAME} - ${WK_NO}
done < ${FILE_NAME}

----- OUTPUT -----
AAA.txt - 1
BBB.txt - 2
CCC.txt - 3

※注意、取り出すフィールド数より実際のフィールド数が足りていないとおかしなことになるので、実際のフィールド数を合わせるのが良いです。

実際のフィールド数よりも多い要素数で取り出してみます。

# 最終行に空行が存在する必要があります
FILE_NAME="./data.txt"

while read WK_NAME WK_NO DUMMY
do
    echo ${WK_NAME} - ${WK_NO} - ${DUMMY}
done < ${FILE_NAME}

ずれてます。このあたりの動きは正確に把握していません。(←だめじゃん)

----- OUTPUT ----- 
 -A.txt - 1
 -B.txt - 2
 -C.txt - 3

1行が複数のフィールドの場合 その2

可変長?のファイルを処理する場合は少し考える必要がでてきます。

たとえば、以下のようなデータの場合などは…

data.txt

GROUPA A1 A2 A3
GROUPB B1
GROUPC C1 C2

この場合は、まずは…
①2フィールドを指定して取り出して
②第2フィールドの値を分解
というような手順にするんじゃないかと思います。

# 最終行に空行が存在する必要があります
FILE_NAME="./data.txt"

while read WK_GROUP WK_FILES
do
    echo ${WK_GROUP} - ${WK_FILES} 
    # WK_FILESを分解して処理していく
    # グループ毎に処理が異なるならグループ判断して分岐させたりする
done < ${FILE_NAME}

----- OUTPUT -----
GROUPA - A1 A2 A3
GROUPB - B1
GROUPC - C1 C2


この記事が気に入ったらサポートをしてみませんか?