Мне нужно объединить записи в зависимости от первых трех общих столбцов и поместить значения, которые являются необычными, в последний столбец, разделенные запятыми. Мне необходимо сделать следующее-
Входной файл:
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