我需要根据前三个常见列合并记录,并将不常见的值放置在最后一列中,以逗号分隔。我有要求执行以下操作-
输入文件 :
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