ロジックの構築 - AWKを使用するよりも優れた点は何ですか?

ロジックの構築 - AWKを使用するよりも優れた点は何ですか?

ログは次のとおりです。

Company=XYZ
Req_id=1234
Time_taken=10 sec
Status=Success

Company=ABC
Req_id=3456
Time_taken=200 sec
Status=Failure

Company=DFG
Req_id=3001
Time_taken=15 sec
Status=Success

最も長い時間がかかった上位3つの要求IDを取得する必要があります。

リクエストIDと経過時間を取得する次の解決策を試しましたが、答えは満足できません。

awk -vRS= -F'[=\n]' '/Time_taken/{print $4,$6}' test.txt | sort -nr

どうすればもっとうまくいくことができますか?組み込み関数の代わりにいくつかのロジックを使用してコーディングしてください。また、よりよく理解する必要がありますか-F'[=\n]'?先ほどのスクリプトからコピーしました。

出力は次のようになります。

Below Request Id took more then expected
Request id 3456, Time Taken 200 sec
Request id 3001, Time Taken 15 sec  
Request id 1234, Time Taken 10 sec

ベストアンサー1

以下のみを使用してくださいawk

function list_insert (value, id, tmp) {
    for (i = 1; i <= list_length; ++i)
        if (value > value_list[i]) {
            tmp = value_list[i]
            value_list[i] = value
            value = tmp

            tmp = id_list[i]
            id_list[i] = id
            id = tmp
        }
}

BEGIN {
    FS = "[= ]"
    list_length = 3
}

$1 == "Req_id"     { id = $2 }
$1 == "Time_taken" { list_insert($2, id) }

END {
    printf("Below Request Id took more then expected\n")
    for (i = 1; i <= list_length; ++i)
        printf("Request id %d, time taken %d sec\n", id_list[i], value_list[i])
}

このプログラムは2つの配列value_listsumを維持します。id_listどちらも長さです。list_length配列value_listはソートされた時間値を含み、配列id_listには最初のリストの値に対応する要求IDが含まれます。

このlist_insert関数は、配列の順序を維持しながら、2つの配列に新しい値とIDを挿入しますvalue_list(正しい挿入位置を見つけて、残りの項目を最後まで混在させます)。

プログラムの残りの部分では、フィールド=はスペースで区切られた改行で区切られたレコードにデータを読み取ります。要求IDが見つかったらに保存しid、「所要時間」項目を見つけたら、そのIDと所要時間の値を配列に挿入します。

最後に、これら2つの配列は出力を生成するために使用されます。

テストしてみてください:

$ awk -f script.awk file
Below Request Id took more then expected
Request id 3456, time taken 200 sec
Request id 3001, time taken 15 sec
Request id 1234, time taken 10 sec

おすすめ記事