共通する列に応じてレコードを結合し、最後の列で共通しない値をカンマ区切りで指定します。

共通する列に応じてレコードを結合し、最後の列で共通しない値をカンマ区切りで指定します。

最初の 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

関連情報