根据公共列合并记录,并将最后一列中不常见的值指定为逗号分隔

根据公共列合并记录,并将最后一列中不常见的值指定为逗号分隔

我需要根据前三个常见列合并记录,并将不常见的值放置在最后一列中,以逗号分隔。我有要求执行以下操作-

输入文件 :

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

相关内容