【実践!CSVデータ集計スクリプト作成編】より複雑な条件を満たすときのみに集計するスクリプト


※ 当ページには【広告/PR】を含む場合があります。
2021/04/17
【シェルスクリプト&Excel】CSVデータから日付範囲で細かい条件指定した集計を行う

CSVデータの自由でより高機能な集計操作を行うスクリプトツールを作成してみる特集の第2回目です。

前の回ではエクセル時間を取り扱うためにDateコマンドを組み合わせる方法から紹介しました。

今回は正規表現を用いてより自由度の高い集計スクリプトの作り方を簡潔に考えてみましょう。

合同会社タコスキングダム|蛸壺の技術ブログ
【シェルスクリプト&Excel】CSVデータから日付範囲で細かい条件指定した集計を行う

CSVデータの集計操作の基礎的な内容も掘り下げつつ、応用的なツールスクリプトに仕上げる方法をじっくり解説していきます


合同会社タコスキングダム|蛸壺の技術ブログ【効果的学習法レポート】シェルスクリプトをこれから学びたい人のためのオススメ書籍&教材特集

はじめに

当サイトではオフィス業務のComputer-Aidedなハイブリッドな方法を模索し、より効率的なExcel業務を実現したい多忙なオフィスワーカー向けの主にAwkとSedを使うシェル講座です。

シェルスクリプトはどこでもどんなOSでも基本的に使えて、しかも一度使い方を覚えると、Excelと組み合わせて最高に効率の良いオフィスワークツールが作れることでしょう。

合同会社タコスキングダム|蛸壺の技術ブログ

ツールスクリプトの概要

とりあえず以下のようなExcelデータシートがあるとします。

データ構造は左から従業員名、所属部署、勤務地、今月未清算分の立替経費、の順で並んでいるとします。

            
            $ cat << EOF > expenses.csv
山下モゲ雄,営業部,本社,7929
島田フガ子,経理部,名古屋支部,50958
岡田ピポ太,製造部,山口工場,27989
沢口モフ代,人事部,本社,28025
銭形ガメ吉,海外部,メキシコ支部,27497
上岡ムメ美,営業部,本社,17544
京谷マハ次,製造部,山口工場,25383
園田フマ由,人事部,本社,23275
田川ポゥ子,製造部,ベトナム工場,37658
満田クタ郎,営業部,本社,32259
島寺ルン大,営業部,本社,41764
香下ウル蔵,製造部,山口工場,17149
蒲田ウオ奈,海外部,メキシコ支部,25229
郷田ポポ生,営業部,名古屋支部,26683
梅岡ボル伍,経理部,本社,41615
亀川ヲル士,製造部,山口工場,18657
EOF
        
例えばここから特定の部署の未精算経費の総額を選択的に表示したい場合、

            
            $ ./add_up_tool.sh expenses.csv
集計したい部署を以下 1/2/3/4 から選択してください

  1) 営業部  2) 経理部  3) 製造部 4) 海外部

※ 終了は q か c を入力!
>>>3

  製造部 : ********** 円
        
みたいにさっと表示してくれるツールを作成してみましょう。


合同会社タコスキングダム|蛸壺の技術ブログ【効果的学習法レポート】シェルスクリプトをこれから学びたい人のためのオススメ書籍&教材特集

ツールスクリプトの実装

早速以下に具体的なシェルスクリプトの実装例を挙げてみます。

            
            #!/bin/bash

#👇連想配列でキーからラベルを取得できるようにする
declare -A branches=(
    ['1']='営業部'
    ['2']='経理部'
    ['3']='製造部'
    ['4']='海外部'
)

#👇集計計算の中身
function Total() {
    #👇option : 1) 営業部 2) 経理部 3) 製造部 4) 海外部
    local option="${branches[$1]}"
    local filepath="$2"
    cat "$filepath" | awk -F"," '
        #👇①正規表現による集計条件
        $2 ~ /'$option'/ { addup += $4 }
        END {print "\n  '$option' : " addup " 円"}
    '
}

#👇対話型で操作を選択的に使う
function Addup() {
    local option
    printf "集計したい部署を以下 1/2/3/4 から選択してください\n"
    printf "\n  1) 営業部  2) 経理部  3) 製造部 4) 海外部\n\n"
    printf "※ 終了は q か c を入力!\n>>>"
    read OPT
    case "$OPT" in
        1 | 2 | 3 | 4 ) Total $OPT $1; option=$OPT;;
        q | c ) echo "終了"; exit 0;;
        * ) printf "ヒント... 1/2/3/4 で入力!\n\n"; Addup $1;;
    esac
    [ -n "$option" ] && exit 1
}

Addup $1
        
これを実行すると、

            
            $./add_up_tool.sh expenses.csv
集計したい部署を以下 1/2/3/4 から選択してください

  1) 営業部  2) 経理部  3) 製造部 4) 海外部

※ 終了は q か c を入力!
>>>2

  経理部 : 92573 円
        
というように期待通りに動作させることができます。

これを可能としているのが上のコードで①の部分で示したAwkスクリプト内の

            
            ...
    #👇①正規表現による集計条件
    $2 ~ /'$option'/ { addup += $4 }
...
        
のアクションブロックが全てであり、データの二列目で$optionの中身(例えば営業部)の文字列にマッチしたときにだけ、集計計算を反映させることが可能です。

なお、Awkの正規表現に関しては以前特集した以下の記事を参考にしてください。

合同会社タコスキングダム|蛸壺の技術ブログ
【シェルスクリプト&Excel】CSVデータ編集で使える最低限覚えておきたい正規表現の活用法

Awk/JqコマンドからCSVファイルを操作する際に最低限覚えておきたい正規表現についてまとめてみます。


合同会社タコスキングダム|蛸壺の技術ブログ【効果的学習法レポート】シェルスクリプトをこれから学びたい人のためのオススメ書籍&教材特集

まとめ

今回はAwkでの正規表現と組み合わせた、もっとも簡単な集計操作に関して説明しました。

ほとんどのCSVデータの複雑な条件を課したときの集計計算は今回のテクニックの拡張で全て実装可能かと思いますので、この機会にじっくり理解していただくと良いかと思います。
記事を書いた人

記事の担当:taconocat

ナンデモ系エンジニア

主にAngularでフロントエンド開発することが多いです。 開発環境はLinuxメインで進めているので、シェルコマンドも多用しております。 コツコツとプログラミングするのが好きな人間です。

合同会社タコスキングダム|蛸壺の技術ブログ【効果的学習法レポート】シェルスクリプトをこれから学びたい人のためのオススメ書籍&教材特集