こんにちは。よっしーです(^^)
今日は、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で集計する方法をご紹介しました。
テキストファイルを集計したり、加工したりするときに便利だったりするので、是非、使ってみてください。自分は、集計するのによく使ってます。
それでは、またあした会いましょう(^^)
コメント