awkのフィールド操作機能を使ったCSVファイルの集計方法

スポンサーリンク
awkのフィールド操作機能を使ったCSVファイルの集計方法 ノウハウ
awkのフィールド操作機能を使ったCSVファイルの集計方法
この記事は約6分で読めます。
よっしー
よっしー

こんにちは。よっしーです(^^)

今日は、awkで集計する方法をご紹介します。

先日、とあるデータを集計しないといけなくなり、awkを使用して、集計したので、その内容の共有になります。

スポンサーリンク

awkとは

awkは、「オーク」と発音されます。開発者3人の名前(Aho、Weinberger、Kernighan)の頭文字から命名されました。 言語名 としてはAWKまたはAwkと表記されることが多いです。

awkは、テキストファイルを処理するためのコマンドラインツールです。awkは、文字列を処理する機能に特化しており、テキストファイル内のテキストのパターンを検索して、そのパターンに一致するテキストを変換したり、抽出したりすることができます。

awkの基本構文は、次のようになります。

awk 'pattern { action }' filename

この構文では、パターンは検索するテキストのパターンを指定し、アクションは、パターンに一致するテキストに対して実行する処理を指定します。ファイル名は、処理するテキストファイルの名前を指定します。

例えば、次のようなテキストファイルを考えてみましょう。

apple,10
orange,15
banana,20

このファイルをカンマで区切られたフィールドとして処理し、フルーツの名前と値段を表示するには、次のようなawkコマンドを使用できます。

awk -F"," '{ print $1 " costs " $2 " yen" }' fruits.txt

このコマンドでは、-Fオプションを使用して、フィールドセパレータをカンマに設定しています。そして、フルーツの名前と値段を表示するために、printコマンドを使用して、フィールド1とフィールド2を出力しています。

# 出力結果
apple costs 10 yen
orange costs 15 yen
banana costs 20 yen

このように、awkを使うことで、テキストファイル内のデータを効率的に処理することができます。

動作環境

この記事で実行しているコマンドは下記の環境で動作確認しています。

% sw_vers 
ProductName:            macOS
ProductVersion:         13.2.1
BuildVersion:           22D68

% sysctl machdep.cpu.brand_string
machdep.cpu.brand_string: Apple M1 Max

% awk -version
awk version 20200816

集計方法

awkを使ってCSVファイルを集計する方法はいくつかありますが、ここでは2つの例を紹介します。

特定の列の値を集計する

以下のようなCSVファイルがあるとします。

name,age,gender
John,25,Male
Mary,30,Female
Sam,27,Male
Sara,22,Female

このファイルの2列目(age)を集計して、合計値と平均値を求めるawkコマンドは以下のようになります。

awk -F',' 'NR>1{sum+=$2}END{print "Sum: " sum ", Average: " sum/(NR-1)}' filename.csv

このコマンドでは、フィールドセパレータにカンマを指定していることに注意してください。また、NR>1という条件を使用して、ヘッダー行をスキップしています。

# 出力結果
Sum: 104, Average: 26

複数列の値を集計する

以下のようなCSVファイルがあるとします。

ame,age,gender,score
John,25,Male,80
Mary,30,Female,90
Sam,27,Male,85
Sara,22,Female,95

このファイルの3列目(gender)と4列目(score)を集計して、性別ごとのスコア合計値と平均値を求めるawkコマンドは以下のようになります。

awk -F',' 'NR>1{sum[$3]+=$4; count[$3]++}END{for(i in sum) print i ", Sum: " sum[i] ", Average: " sum[i]/count[i]}' filename.csv

このコマンドでは、フィールドセパレータにカンマを指定しています。sum配列とcount配列を使用して、性別ごとのスコア合計値と行数を保存しています。最後に、forループを使用して、性別ごとにスコア合計値と平均値を出力しています。

# 出力結果
Male, Sum: 165, Average: 82.5
Female, Sum: 185, Average: 92.5

その他の便利な使い方

awkには非常に多くの機能がありますが、ここではawkの便利な使い方をいくつか紹介します。

パターンマッチング

awkは、パターンマッチングをサポートしているため、テキストファイルから必要な情報を取得するために非常に役立ちます。たとえば、次のようなコマンドを使用して、ユーザー名とユーザーIDを表示することができます。

awk -F':' '/\/bin\/bash/{print $1, $3}' /etc/passwd

このコマンドでは、/bin/bashが含まれる行を検索して、ユーザー名とユーザーIDを出力しています。

フィールド操作

awkは、テキストファイルのフィールドを操作する機能を提供しています。たとえば、次のようなコマンドを使用して、CSVファイルのフィールドを操作することができます。

awk -F',' '{print $2, $1}' filename.csv

このコマンドでは、カンマで区切られた2番目のフィールドと1番目のフィールドを入れ替えて、新しいファイルに出力しています。

出力フォーマットのカスタマイズ

awkは、出力フォーマットをカスタマイズする機能を提供しています。たとえば、次のようなコマンドを使用して、CSVファイルのデータをカスタマイズされた形式で出力することができます。

awk -F',' '{printf "%-10s %-10s %-10s\n", $1, $2, $3}' filename.csv

このコマンドでは、printf関数を使用して、フィールドをカスタマイズされた幅に整形して出力しています。

その他

これらは、awkの便利な使い方の一部です。awkには多くの機能がありますので、必要に応じてドキュメントを参照することをお勧めします。

おわりに

今日は、awkで集計する方法をご紹介しました。

テキストファイルを集計したり、加工したりするときに便利だったりするので、是非、使ってみてください。自分は、集計するのによく使ってます。

よっしー
よっしー

それでは、またあした会いましょう(^^)

コメント

タイトルとURLをコピーしました