Tips
コード例
`awk`は、テキストファイルをパターンでスキャンし、指定されたアクションを実行する強力なコマンドラインツールです。特に、CSVやTSVなどの区切り文字で区切られたデータから特定の列を抽出したり、条件に基づいて集計したりするのに非常に適しています。
技術・言語・ツール: awk
awkは、テキストファイルをパターンでスキャンし、指定されたアクションを実行する強力なコマンドラインツールです。特に、CSVやTSVなどの区切り文字で区切られたデータから特定の列を抽出したり、条件に基づいて集計したりするのに非常に適しています。
CSV/TSVデータを高速に処理する awk の基本
awkは、ログ分析やデータ整形において非常に強力なツールです。特に、区切り文字で区切られたファイル(CSV, TSVなど)から特定のフィールド(列)を抽出したり、条件に基づいて処理を行ったりする際に、その真価を発揮します。sedやgrepだけでは難しい複雑なデータ処理も簡潔に記述できます。
コード例
まず、サンプルデータ data.csv を作成します。
ID,Name,Score,City
1,Alice,85,Tokyo
2,Bob,92,Osaka
3,Charlie,78,Tokyo
4,David,95,Kyoto
5,Eve,88,Osaka
1. 特定の列(フィールド)を抽出する
カンマ区切り(CSV)のファイルから、NameとScoreの列だけを抽出します。
awk -F',' '{print $2, $3}' data.csv
出力例:
Name Score
Alice 85
Bob 92
Charlie 78
David 95
Eve 88
2. 条件に合う行だけを処理する
Scoreが90点以上の人のIDと名前だけを表示します。ヘッダー行(NR > 1)をスキップする条件も追加しています。
awk -F',' 'NR > 1 && $3 >= 90 {print $1, $2}' data.csv
出力例:
2 Bob
4 David
3. 各都市の合計スコアを計算する
各都市のスコアを合計し、最後にその結果を表示します。BEGINでヘッダーをスキップし、ENDで集計結果を出力します。
awk -F',' '
BEGIN {
# ヘッダー行をスキップするためのフラグ
header_skipped = 0;
}
{
if (!header_skipped) {
header_skipped = 1;
next; # ヘッダー行をスキップ
}
scores[$4] += $3; # 都市名をキーとしてスコアを加算
}
END {
for (city in scores) {
print city ": " scores[city]
}
}' data.csv
出力例:
Tokyo: 163
Osaka: 180
Kyoto: 95
注意点やおすすめポイント
-Fオプション: 区切り文字(フィールドセパレータ)を指定します。デフォルトは空白文字です。CSVなら-F','、TSVなら-F'\t'と指定します。$1, $2, ...: 各フィールドの値を参照します。$0は行全体を表します。NR(Number of Record): 現在処理している行番号です。NR > 1でヘッダー行をスキップする際によく使われます。NF(Number of Field): 現在の行のフィールド数です。BEGINとENDブロック:BEGINはファイル処理開始前に一度だけ実行され、ENDはファイル処理終了後に一度だけ実行されます。変数の初期化や最終結果の出力に便利です。- 配列: 連想配列を簡単に扱えるため、上記の例のように集計処理に非常に強力です。
awkスクリプトをファイルに記述し、awk -f script.awk data.txtのように実行することも可能です。より複雑な処理を記述する際に便利です。