共通列に基づいてレコードをマージし、最後の列に珍しい値をカンマで区切って指定する

共通列に基づいてレコードをマージし、最後の列に珍しい値をカンマで区切って指定する

最初の3つの共通列に基づいてレコードをマージし、最後の列に珍しい値をカンマで区切って配置する必要があります。私は以下を行う必要があります -

入力ファイル:

HWF CommonDomain  javatools       AdminServer
ABC CommonDomain  resourcebundle  AdminServer
HWF CommonDomain  stringeditor    AdminServer
ABC CommonDomain  resourcebundle  HelpPortalServer_1
HWF CommonDomain  stringeditor    HelpPortalServer_1 
HWF CommonDomain  javatools       HelpPortalServer_1

予想出力:

ABC CommonDomain resourcebundle   AdminServer,HelpPortalServer_1
HWF CommonDomain javatools       AdminServer,IHelpPortalServer_1 
HWF CommonDomain stringeditor   AdminServer,HelpPortalServer_1 

答え1

質問を更新していただきありがとうございます。 100%改善されました。

いわゆる「非一般的な」値に含まれる値を出力で繰り返す必要があるかどうかについて言及していませんでしたが、私の考えではそうではありません。

このスクリプトはすべてのバージョンで動作する必要がありますawkGNU 拡張はありません。テストのためのgawk --traditionalより多くの条件をテストするために追加の入力データを追加しました。これは入力の重複レコードを処理します。私が予想する最大の問題は入力のカンマです。スクリプトは指定されたとおりに機能しますが、出力ファイルには空のフィールドがあるように見えます。

コードの説明:

配列recsは最初の3つのフィールドを連結することによってインデックス付けされます。 (配列はawk文字列でインデックス付けされています。)配列の各要素には、カンマで区切られた「一般的ではない」フィールドが含まれています。

各入力行について:key最初の3つのフィールドを含みます。ループはfor残りのフィールドを段階的に進めます。このifステートメントは、そのキーのフィールドがすでに保存されていないことを確認します。そうでない場合、そのフィールドはレコードの最後に追加され、適切にスペースまたはカンマが先頭に追加されます。

入力の終わり(ENDラベル):キーを介してrecs配列に移動し、キーとキーに含まれるデータを印刷します。

#!/bin/sh

awk '
    {
        key = $1 " " $2 " " $3;
        for (i = 4; i <= NF; i++) {
            if (recs[key] !~ "(^|,)"$i"(,|$)") {
                recs[key] = recs[key] (recs[key] ? "," : "") $i
            }
        }
    }
    END {
        for (key in recs) {
            print key " " recs[key]
        }
    }
' <<EOF
HWF CommonDomain  javatools       AdminServer
HWF CommonDomain  javatools       AdminServer2
HWF CommonDomain  javatools       3AdminServer
HWF CommonDomain  javatools       AdminServer
HWF CommonDomain  javatools       AdminServer
ABC CommonDomain  resourcebundle  AdminServer
ABC CommonDomain  resourcebundle  AdminServer
ABC CommonDomain  resourcebundle  AdminServer2
ABC CommonDomain  resourcebundle  3AdminServer
HWF CommonDomain  stringeditor    AdminServer2
HWF CommonDomain  stringeditor    3AdminServer
ABC CommonDomain  resourcebundle  HelpPortalServer
HWF CommonDomain  stringeditor    HelpPortalServer_1 
HWF CommonDomain  javatools       HelpPortalServer_1
HWF CommonDomain  javatools       HelpPortalServer_2
HWF CommonDomain  javatools       3_HelpPortalServer_2
HWF CommonDomain  stringeditor    HelpPortalServer 
HWF CommonDomain  javatools       HelpPortalServer_1
HWF CommonDomain  javatools       HelpPortalServer_2
HWF CommonDomain  javatools       3_HelpPortalServer
EOF

出力:

HWF CommonDomain stringeditor AdminServer,HelpPortalServer_1
HWF CommonDomain javatools AdminServer,AdminServer2,3AdminServer,HelpPortalServer_1,HelpPortalServer_2,3_HelpPortalServer_2
ABC CommonDomain resourcebundle AdminServer,HelpPortalServer_1

関連情報