Linux シェルスクリプト|スペース区切りの CSV ファイルを行毎にループして処理するサンプルスクリプト|ヘッダ行がない場合とある場合|bash シェル


スペース区切りの CSV ファイルを行毎にループして処理するサンプルスクリプトを作成する。下記のヘッダ行がない場合とある場合の CSV ファイル sample.csv を処理するスクリプトを作成する。


・ヘッダ行なし sample.csv

項目1a 項目1b 項目1c
項目2a 項目2b 項目2c
項目3a 項目3b 項目3c

・ヘッダ行あり sample.csv

※1 行目はヘッダ

ヘッダa ヘッダb ヘッダc
項目1a 項目1b 項目1c
項目2a 項目2b 項目2c
項目3a 項目3b 項目3c


カンマ区切りの CSV ファイルを行毎にループして処理するサンプルスクリプト|ヘッダ行がない場合とある場合|Linux bash シェルスクリプト


設定ファイル (リストファイル) を作成して行毎にループして処理するサンプルスクリプト|コメント行はスキップさせる|Linux bash シェルスクリプト





ヘッダ行がないスペース区切りの CSV ファイルを for 文でループして処理

下記の sample.sh を作成する。

・sample.sh

#!/bin/bash

#IFSを「改行」に設定して、下記のfor文でsample.csvを行毎にループする
PRE_IFS=${IFS}
IFS=$'\n'

for line in `cat sample.csv`
do
  col1=`echo ${line} | awk '{print $1}'`
  col2=`echo ${line} | awk '{print $2}'`
  col3=`echo ${line} | awk '{print $3}'`

  #ここに処理を実装
  echo ${col1}
  echo ${col2}
  echo ${col3}

done

#IFSの設定を元に戻す
IFS=${PRE_IFS}


・ヘッダ行なし sample.csv

項目1a 項目1b 項目1c
項目2a 項目2b 項目2c
項目3a 項目3b 項目3c

この sample.sh を実行すると、下記が標準出力される。

項目1a
項目1b
項目1c
項目2a
項目2b
項目2c
項目3a
項目3b
項目3c



ヘッダ行があるスペース区切りの CSV ファイルを for 文でループして処理

下記の sample.sh を作成する。

・sample.sh

#!/bin/bash

#IFSを「改行」に設定して、下記のfor文でsample.csvを行毎にループする
PRE_IFS=${IFS}
IFS=$'\n'

for line in `cat sample.csv | sed '1d'`
do
  col1=`echo ${line} | awk '{print $1}'`
  col2=`echo ${line} | awk '{print $2}'`
  col3=`echo ${line} | awk '{print $3}'`

  #ここに処理を実装
  echo ${col1}
  echo ${col2}
  echo ${col3}

done

#IFSの設定を元に戻す
IFS=${PRE_IFS}


・ヘッダ行あり sample.csv

※1 行目はヘッダ

ヘッダa ヘッダb ヘッダc
項目1a 項目1b 項目1c
項目2a 項目2b 項目2c
項目3a 項目3b 項目3c


この sample.sh を実行すると、下記が標準出力される。sed '1d' で 1行目のヘッダ行を除外して処理している。

項目1a
項目1b
項目1c
項目2a
項目2b
項目2c
項目3a
項目3b
項目3c


補足

項目間のスペースの数は 1 つだけでなく、複数でも上記のシェルは同様に処理できる。下記のようにヘッダ行にあわせて 2 行目以降の項目間のインデントで複数のスペースを設定しても問題なく動作する。

・sample.csv

ヘッダa ヘッダb ヘッダc
項目1a  項目1b  項目1c
項目2a  項目2b  項目2c
項目3a  項目3b  項目3c






スポンサーリンク

0 件のコメント :

コメントを投稿