Tips

コード例

`awk`は、テキストファイルをパターンでスキャンし、指定されたアクションを実行する強力なコマンドラインツールです。特に、CSVやTSVなどの区切り文字で区切られたデータから特定の列を抽出したり、条件に基づいて集計したりするのに非常に適しています。

技術・言語・ツール: awk

awkは、テキストファイルをパターンでスキャンし、指定されたアクションを実行する強力なコマンドラインツールです。特に、CSVやTSVなどの区切り文字で区切られたデータから特定の列を抽出したり、条件に基づいて集計したりするのに非常に適しています。

CSV/TSVデータを高速に処理する awk の基本

awkは、ログ分析やデータ整形において非常に強力なツールです。特に、区切り文字で区切られたファイル(CSV, TSVなど)から特定のフィールド(列)を抽出したり、条件に基づいて処理を行ったりする際に、その真価を発揮します。sedgrepだけでは難しい複雑なデータ処理も簡潔に記述できます。

コード例

まず、サンプルデータ 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): 現在の行のフィールド数です。
  • BEGINENDブロック: BEGINはファイル処理開始前に一度だけ実行され、ENDはファイル処理終了後に一度だけ実行されます。変数の初期化や最終結果の出力に便利です。
  • 配列: 連想配列を簡単に扱えるため、上記の例のように集計処理に非常に強力です。
  • awkスクリプトをファイルに記述し、awk -f script.awk data.txtのように実行することも可能です。より複雑な処理を記述する際に便利です。