ログは次のとおりです。
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_list
sumを維持します。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