このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

Linuxコマンドの基本:CSVファイルから集計する:awkコマンド

CSVファイルから集計する:awkコマンド

 awkコマンドは、テキストデータを効率的に処理・解析するための強力なツールです。ここでは、awkコマンドを使って、CSVファイルからデータを集計する方法を解説します。具体的には、「学籍番号、性別、名前、点数」が記録されたCSVファイルから、点数の平均値を計算する方法を見ていきます。

awkコマンドの概要

 awkは、テキストファイルを行(レコード)と列(フィールド)に分割し、パターンとアクションに基づいてデータを処理するプログラミング言語です。特にデータの抽出や集計、レポート生成などに利用されます。

awkコマンドの書式

awkコマンドの基本的な書式は以下の通りです。

【書式】
awk 'パターン { アクション }' ファイル名

  • [オプション]awkの動作を変更するオプション。例えば、フィールド区切り文字を指定する-Fなどがあります。
  • 'パターン { アクション }':処理の内容を指定するスクリプト部分です。
    パターン:アクションを実行する条件を指定します。省略すると全ての行が対象になります。
    アクション:パターンにマッチした行に対して実行する処理を記述します。{}で囲みます。
  • ファイル名:処理対象のファイルを指定します。省略した場合は標準入力から読み込みます。

CSVファイルからスコア集計

 awkを使って、実用的なデータ集計を行ってみましょう。ここでは、「学籍番号、性別、名前、点数」が記録されたカンマ区切りのCSVファイル(student.csv)から、点数の平均値を計算する方法を解説します。

集計対象の記録ファイル student.csv

まず、サンプルデータとして以下の内容のstudent.csvファイルを作成します。

user01@ubuntu-vm:~$ nano student.csv

student.csvの内容

1001,Male,Alice,80
1002,Female,Bob,90
1003,Male,Charlie,75
1004,Female,Diana,85
1005,Male,Edward,95

区切り文字をカンマに指定してフィールドを表示

 awkはデフォルトでフィールドの区切り文字を空白(スペースやタブ)として処理します。しかし、今回はカンマ区切りのCSVファイルを扱うため、-Fオプションを使用して区切り文字をカンマ(,)に指定します。

例:区切り文字をカンマに指定して学籍番号、性別、名前を表示

user01@ubuntu-vm:~$ awk -F, '{print $1, $2, $3}' student.csv

出力結果

1001 Male Alice
1002 Female Bob
1003 Male Charlie
1004 Female Diana
1005 Male Edward

解説

  • -F,:区切り文字をカンマに指定します。
  • {print $1, $2, $3}:第1フィールド(学籍番号)、第2フィールド(性別)、第3フィールド(名前)を表示します。

最終フィールド(点数)を表示

フィールド数が一定しない場合でも、$NFを使用することで最後のフィールドを参照できます。

例:最終フィールドの点数を表示

user01@ubuntu-vm:~$ awk -F, '{print $NF}' student.csv

出力結果

80
90
75
85
95

解説

  • $NF:各行の最後のフィールドを指します(この場合は点数)。

点数の累計を計算

 点数の平均値を計算するために、まず各学生の点数を合計します。点数を足すためにsumという変数を作り、それをレコードごとに点数で足し上げていきます。awkでは変数の宣言や初期化なしで、すぐに変数を使用できます。数値変数の初期値は0です。

例:点数の累計を表示

user01@ubuntu-vm:~$ awk -F, '{sum += $NF} END{print "Total Score:", sum}' student.csv

出力結果

Total Score: 425

解説

  • {sum += $NF}:各行の点数をsum変数に加算します。
  • sum += $NFsum = sum + $NFと同じ意味です。
  • END{print "Total Score:", sum}:全てのレコード処理後に、合計点数を表示します。

平均値の計算

合計点数が計算できたので、次に平均値を求めます。平均値は、合計点数を学生数で割ることで得られます。

例:平均値の計算

user01@ubuntu-vm:~$ awk -F, '{sum += $NF} END{print "Average Score:", sum/NR}' student.csv

出力結果

Average Score: 85

解説

  • NR:現在までに読み込んだレコード数(ここでは学生数)を表す組み込み変数。
  • sum/NR:合計点数を学生数で割り、平均点を計算します。

awkスクリプトの保存と再利用

一度作成したawkスクリプトを再利用できるように、スクリプトファイルとして保存します。

スクリプトファイル average.awk の作成

user01@ubuntu-vm:~$ nano average.awk

average.awkの内容

{sum += $NF}
END{print "Average Score:", sum/NR}

コマンド例:スクリプトファイルを使用して平均値を計算

awkコマンドでは、スクリプトファイルを-fオプションで読み込んで実行することができます。

user01@ubuntu-vm:~$ awk -F, -f average.awk student.csv

出力結果

Average Score: 85

解説

  • -f average.awkaverage.awkスクリプトファイルを読み込んで実行します。
  • -F,:区切り文字をカンマに指定します。

不要になったファイルの削除

作業が終わったら、不要になったファイルを削除します。

user01@ubuntu-vm:~$ rm student.csv average.awk

まとめ

  • 区切り文字の指定-Fオプションでフィールドの区切り文字を指定できます。カンマ区切りのCSVファイルでは-F,とします。
  • フィールドの参照$1, $2, …, $NFで各フィールドを参照できます。$NFは最後のフィールドを指します。
  • 変数の利用awkでは変数の宣言や初期化なしで使用できます。数値変数の初期値は0です。
  • 累計と平均値の計算:変数を用いて累計を計算し、NR(レコード数)を使って平均値を求めます。
  • ENDブロックEND{}内のアクションは、全てのレコード処理が終わった後に実行されます。
  • スクリプトの再利用-fオプションでスクリプトファイルを読み込み、再利用可能です。

 awkコマンドを使いこなすことで、データ集計やテキスト処理を効率的に行うことができます。特に、簡単なデータ解析であれば、表計算ソフトを使わずにコマンド一つで完了させることができます。