根據公共列合併記錄,並將最後一列中不常見的值指定為逗號分隔

根據公共列合併記錄,並將最後一列中不常見的值指定為逗號分隔

我需要根據前三個常見列合併記錄,並將不常見的值放置在最後一列中,以逗號分隔。我有要求執行以下操作-

輸入檔 :

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

感謝您更新問題,百分百好轉。

您沒有提到您所謂的“不常見”值中的值是否應該在輸出中重複,我認為不會。

該腳本應該在所有版本的awk. 沒有 GNU 擴展,測試用gawk --traditional.我添加了額外的輸入資料來測試更多條件。這處理輸入中的重複記錄。我預見的最大問題是輸入中的逗號,腳本將按指定工作,但輸出檔案可能看起來有空字段等。

代碼說明:

recs數組透過前三個字段的串聯來索引。 (中的陣列awk由字串索引。)陣列的每個元素都包含您所說的用逗號分隔的「不常見」欄位。

對於每個輸入行:key包含前三個欄位。循環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

相關內容