awkを使用してファイル内の特定の列でグループ化する

awkを使用してファイル内の特定の列でグループ化する

SQLクエリからエクスポートされたデータをファイルに入れましたtemp.log

以下はサンプルデータです。ヘッダー行の後の項目は、最初の列に基づいてソートされます。

また、ノード(36,54,69,76)を固定リストと見なします。

<Name> <Status> <Node> <Requests>
AString1 Success 36 1
AString1 Success 54 4
AString1 Success 69 3
AString1 Success 76 4
BString2 Success 36 1
BString2 Success 54 2
BString2 Success 69 3
BString2 Success 76 1
CString3 Success 36 8
CString3 Success 54 7
CString3 Success 76 8
DString4 Success 36 8
DString4 Success 54 4
DString4 Success 69 12
DString4 Success 76 7

次の出力が必要です

<Name> <Nodes> <Count of Requests>
Astring1 36 54 69 76 12
BString2 36 54 69 76 7
CString3 36 54 NA 76 23
DString4 36 54 69 76 31

ここの最後の列(<Count of Requests>)は、その名前の各ノードに対する要求の総数を表します。

NAノードが要求を受信しなかった場合は、この内容を印刷する必要があります。 (o / pでCString3行を見ることができます。ノード値の行がありません。この場合は、次のようにする必要があり69ます。NACString3 36 54 NA 76 23

成功事例では、DString4 -DString4 36 54 69 76 31

awkコマンドを使用してこれを実行できますか?

ベストアンサー1

$ cat tst.awk
NR==1 {
    print "<Name>", "<Nodes>", "<Count of Requests>"
    next
}
$1 != prev {
    if ( NR > 2 ) {
        prt()
    }
    prev = $1
}
{
    reqs[$3]
    numReqs += $4
}
END { prt() }

function prt(   i, n, node, nodes) {
    n = split("36 54 69 76", nodes)

    printf "%s ", prev
    for (i=1; i<=n; i++) {
        node = nodes[i]
        printf "%s ", (node in reqs ? node : "NA")
    }
    print numReqs

    delete reqs
    numReqs = 0
}

$ awk -f tst.awk file
<Name> <Nodes> <Count of Requests>
AString1 36 54 69 76 12
BString2 36 54 69 76 7
CString3 36 54 NA 76 23
DString4 36 54 69 76 31

おすすめ記事