シェルプログラミング - 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
この記事が気に入ったらサポートをしてみませんか?