Объединить записи в зависимости от общих столбцов и указать значения, которые являются необычными в последнем столбце, разделенные запятыми.

Объединить записи в зависимости от общих столбцов и указать значения, которые являются необычными в последнем столбце, разделенные запятыми.

Мне нужно объединить записи в зависимости от первых трех общих столбцов и поместить значения, которые являются необычными, в последний столбец, разделенные запятыми. Мне необходимо сделать следующее-

Входной файл:

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% лучше.

Вы не упомянули, следует ли дублировать в выходных данных значения, которые вы называете «необычными». Полагаю, что нет.

Этот скрипт должен работать во всех версиях 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

Связанный контент