Вот ответ awk (1) и sort (1):
Ваши данные - это набор данных «многие ко многим», поэтому первым шагом является нормализация данных с одним ключом и значением в строке. Мы также поменяем местами ключи и значения, чтобы указать новое первичное поле, но это не является строго необходимым, поскольку нижние части не зависят от порядка. Мы используем табуляцию или [пробелы], [пробелы] в качестве разделителя полей, поэтому мы разделяем на вкладке между ключом и значениями и между значениями. Это оставит пробелы встроенными в значения, но обрежет их до и после:
awk -F '\t| *, *' '{ for (i=2; i<=NF; ++i) { print $i"\t"$1 } }'
Тогда мы хотим применить ваш порядок сортировки и устранить дубликаты. Мы используем функцию bash, чтобы указать символ табуляции в качестве разделителя (-t $ '\ t'). Если вы используете оболочку Bourne / POSIX, вам нужно использовать '[tab]', где [tab] - буквенная вкладка:
sort -t $'\t' -u -k 1f,1 -k 2n
Затем верните его в нужную форму:
awk -F '\t' '{
if (key != $1) {
if (key) printf "\n";
key=$1;
printf "%s\t%s", $1, $2
} else {
printf ", %s", $2
}
}
END {printf "\n"}'
Соедините их вместе, и вы должны получить желаемый результат. Я тестировал с помощью инструментов GNU.