3

次のことについて助けが必要です。

入力ファイル:

abc message=sent session:111,x,y,z
pqr message=receive session:111,4,5,7
abc message=sent session:123,x,y,z
pqr message=receive session:123,4,5,7
abc message=sent session:342,x,y,z
abc message=sent session:589,x,y,z
pqr message=receive session:589,4,5,7

出力ファイル:

abc message=sent session:111,x,y,z, pqr message=receive session:111,4,5,7
abc message=sent session:123,x,y,z, pqr message=receive session:123,4,5,7
abc message=sent session:342,x,y,z, NOMATCH
abc message=sent session:589,x,y,z, pqr message=receive session:589,4,5,7

ノート:

ソースファイルに表示されている場合、すべての「送信済み」メッセージ
に対して、session=342 の場合のみ「受信」があります受信
セッションは不明であり、ハードコードすることはできません
したがって、送信されたもののみをマージし、一致するセッション番号がある場所で受信します

4

2 に答える 2

1

を使用する1つの方法がありawkます。次のように実行します:

awk -f script.awk file

内容script.awk

{
    x = $0

    gsub(/[^:]*:|,.*/,"")

    a[$0] = (a[$0] ? a[$0] "," FS : "") x
    b[$0]++
}

END {
    for (i in a) {
        print (b[i] == 2 ? a[i] : a[i] "," FS "NOMATCH") | "sort"
    }
}

結果:

abc message=sent session:111,x,y,z, pqr message=receive session:111,4,5,7
abc message=sent session:123,x,y,z, pqr message=receive session:123,4,5,7
abc message=sent session:342,x,y,z, NOMATCH
abc message=sent session:589,x,y,z, pqr message=receive session:589,4,5,7

または、これがワンライナーです。

awk '{ x = $0; gsub(/[^:]*:|,.*/,""); a[$0] = (a[$0] ? a[$0] "," FS : "") x; b[$0]++ } END { for (i in a) print (b[i] == 2 ? a[i] : a[i] "," FS "NOMATCH") | "sort" }' file

sortソートされた出力を気にしない場合は、パイプをドロップできることに注意してください。HTH。

于 2013-02-13T06:11:17.283 に答える
1

別の方法:

awk -F "[:,]"  '/=sent/{a[$2]=$0;}/=receive/{print a[$2], $0;delete a[$2];}END{for(i in a)print a[i],"NO MATCH";}' file

結果:

abc message=sent session:111,x,y,z pqr message=receive session:111,4,5,7
abc message=sent session:123,x,y,z pqr message=receive session:123,4,5,7
abc message=sent session:589,x,y,z pqr message=receive session:589,4,5,7
abc message=sent session:342,x,y,z NO MATCH

レコードが検出されるsendと、セッション ID をインデックスとして配列に格納されます。receiveレコードが検出されると、レコードsendが配列からフェッチされ、receiveレコードとともに出力されます。receiveまた、送信されたレコードは、レコードが受信されると配列から削除されます。END では、配列内の残りのすべてのレコードが NO MATCH として出力されます。

于 2013-02-13T06:29:50.647 に答える