drambuieの日記

drambuie, life is a dram to be satisfied with

`awk`で生成AIを使う🚀

awkで生成AIを使う🚀

awkは強力なテキスト処理ツールですが、外部コマンドや拡張機能と連携することで、その可能性は飛躍的に広がります。今回は、awkからcurlを使って生成AIのAPIを呼び出し、テキストの内容に基づいて判断させる方法を解説します。さらに、高速化のためのヒントとして、gawkの組み込み機能や拡張ライブラリを使った方法も紹介します。

awkからcurlで生成AIを使う方法🤖

生成AIのAPI(ここではGoogleのGemini APIを想定)にリクエストを送信するには、curl コマンドを使います。APIキーやAIへのプロンプトをJSON形式でcurlに渡すことで、テキストをAIに分析させることができます。また、AIからの応答がJSON形式で返されるため、その処理にはjqコマンドが利用できます。

awkで外部コマンドを実行するには、cmd | getline var を使用します。これにより、外部コマンドcmdの出力をawkプログラム内の変数varとして受け取ることができます。このとき、getlineはコマンドの出力を1行ずつ読み込むことに注意してください。複数行にわたる出力をすべて取得するには、行数分だけgetlineをループして実行する必要があります。

例えば、以下のコマンドは1回だけgetlineを実行するため、最初の1行しか取得できません

"ls -l" | getline first_line

複数行の出力をすべて取得するには、以下のようにループを使います。

while ("ls -l" | getline output_line) {
    # output_line には 'ls -l' の各行が順次入る
    print output_line
}

実行の流れ

  1. awkCSVファイルから各行を読み込む。
  2. 各行のデータ(商品名、価格など)を基に、AIへのプロンプトを生成する。
  3. 生成したプロンプトをJSONペイロードに含め、|を使ってcurlコマンドに渡す。
  4. curlAPIにリクエストを送信し、JSON形式のレスポンスを受け取る。
  5. awk| getlineを使ってcurlの出力(JSONレスポンス)を読み込み、処理する。

具体例:お小遣い帳の価格判定プログラム

それでは、awkcurlを使って「お小遣い帳の買い物の価格が割安か割高か」を判定するプログラムを作成しましょう。

入力として、以下の形式のCSVファイル kakeibo.csv を用意します。

2025-09-01,牛乳,300円,食費
2025-09-01,キャベツ,200円,食費
2025-09-01,ノート,150円,学用品

サンプルコード

以下のスクリプトprice_checker.awk として保存します。このスクリプトは、CSVから商品名と価格を抽出し、生成AIに判断を仰ぎます。

💡文字コードについて awkスクリプトを記述する際は、UTF-8で保存することに留意してください。

#!/usr/bin/awk -f

BEGIN {
    FS = "," # CSVファイルの区切り文字をカンマに設定
    # APIのエンドポイントURLとAPIキーを設定
    API_URL = "https://example.com/api/your-genai-endpoint"
    API_KEY = "YOUR_API_KEY"

    # curlコマンドの基本部分を構築
    CURL_BASE = "curl -s -X POST " API_URL " -H 'Content-Type: application/json' -H 'x-api-key: " API_KEY "' --data '"
}

{
    # CSVの各行を処理
    item = $2
    price = $3

    # AIへのプロンプトを生成
    prompt = item "の現在の小売価格と比較して、" price "は高いか安いか?高い場合は「高い」、安い場合は「安い」だけを答えて。"

    # JSONペイロードを構築
    payload = "{\"model\": \"gemini-1.5-pro-latest\",\"contents\": [{\"parts\": [{\"text\": \"" prompt "\"}]}]}"

    # curlコマンドを生成して実行
    cmd = CURL_BASE payload "'"
    # ここではAPIからのレスポンスが1行であることを想定している
    cmd | getline response_json

    # コマンドのクローズは必須
    close(cmd)

    # jqでJSONからAIの回答を抽出
    cmd_jq = "echo '" response_json "' | jq -r '.candidates[0].content.parts[0].text'"
    # jqの出力も1行であることを想定している
    cmd_jq | getline result

    # コマンドのクローズ
    close(cmd_jq)

    # 判定結果を出力
    print item, price, ":", result
}

実行方法

スクリプトに実行権限を与え、CSVファイルを渡します。

chmod +x price_checker.awk
./price_checker.awk kakeibo.csv

これにより、以下のような出力が期待できます。

牛乳 300円 : 高い
キャベツ 200円 : 安い
ノート 150円 : 妥当

💡高速化のヒント:gawkの組み込み機能と拡張ライブラリを使う

awkからcurlのような外部コマンドを呼び出す方法はシンプルで便利ですが、大量のデータを処理する際には他プロセス呼び出しのオーバーヘッドが生じ、パフォーマンスが低下することがあります。これを解決するのが、gawk組み込みネットワーク機能拡張ライブラリです。

gawkGNU版のawkで、gawkのプログラム内で直接TCP/IP通信を行うための組み込み機能を備えています。これにより、外部コマンドを使わずにHTTPリクエストを完結させることができ、プロセスの切り替えが不要になるため、処理速度が大幅に向上します。

HTTP処理とJSON処理のコード例

gawkの組み込み機能と拡張ライブラリを組み合わせたコード例です。

1. HTTP処理のコード例

gawkのソケット通信機能を使った、HTTP POSTリクエストを行う関数を簡潔に示します。

# このコードはgawkのソケット機能を概念的に示すものです。

function http_post(host, port, path, payload,    sock, request, response, line) {
    # サーバーにTCP接続
    sock = "/inet/tcp/0/" host "/" port
    print "POST " path " HTTP/1.1\r" > sock
    print "Host: " host "\r" > sock
    print "Content-Type: application/json\r" > sock
    print "Content-Length: " length(payload) "\r" > sock
    print "\r" > sock
    print payload > sock
    close(sock)

    # サーバーからのレスポンスを読み込み
    while ((getline line < sock) > 0) {
        response = response line
    }
    close(sock)

    return response
}

2. JSON文字列のパース(解析)

gawkの拡張ライブラリには、JSONを扱うための専用ライブラリ json もあります。これにより、外部のjqコマンドを呼び出すことなく、gawkのプログラム内で直接JSONデータをパースしたり、生成したりできます。

gawkjson拡張機能を使ったJSON文字列のパース例です。

# 実行コマンドの例: gawk --load json -f script.awk
# 入力例: {"candidates":[{"content":{"parts":[{"text":"高い"}]}}]}

BEGIN {
    json_string = "{\"candidates\":[{\"content\":{\"parts\":[{\"text\":\"高い\"}]}}]}"
    if (json_parse(json_string, array, "candidates")) {
        result = array[1]["content"]["parts"][1]["text"]
        print result  # 出力: 高い
    }
}

これらの機能を使うことで、curljqのような外部コマンドへの依存をなくし、処理の高速化とスクリプトの自己完結性を高めることができます。

awkは単なるテキスト処理ツールではなく、外部のWebサービスと連携する強力なスクリプト言語としても機能します。 大量のテキストデータに対して生成AIを使った解析を行うことも可能です。 このアイデアを基に、ぜひ魅力的なスクリプトを作成してみてください。