このページで解説している内容は、以下の 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 += $NF
はsum = 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.awk
:average.awk
スクリプトファイルを読み込んで実行します。-F,
:区切り文字をカンマに指定します。
不要になったファイルの削除
作業が終わったら、不要になったファイルを削除します。
user01@ubuntu-vm:~$ rm student.csv average.awk
まとめ
- 区切り文字の指定:
-F
オプションでフィールドの区切り文字を指定できます。カンマ区切りのCSVファイルでは-F,
とします。 - フィールドの参照:
$1
,$2
, …,$NF
で各フィールドを参照できます。$NF
は最後のフィールドを指します。 - 変数の利用:
awk
では変数の宣言や初期化なしで使用できます。数値変数の初期値は0
です。 - 累計と平均値の計算:変数を用いて累計を計算し、
NR
(レコード数)を使って平均値を求めます。 - ENDブロック:
END{}
内のアクションは、全てのレコード処理が終わった後に実行されます。 - スクリプトの再利用:
-f
オプションでスクリプトファイルを読み込み、再利用可能です。
awk
コマンドを使いこなすことで、データ集計やテキスト処理を効率的に行うことができます。特に、簡単なデータ解析であれば、表計算ソフトを使わずにコマンド一つで完了させることができます。