这是一个 awk(1) 和 sort(1) 的答案:
您的数据基本上是一个多对多数据集,因此第一步是使用每行一个键和一个值对数据进行规范化。我们还将交换键和值以指示新的主字段,但这并不是绝对必要的,因为较低的部分不依赖于顺序。我们使用制表符或 [spaces],[spaces] 作为字段分隔符,因此我们在键和值之间以及值之间拆分制表符。这将在值中嵌入空格,但从前后修剪它们:
awk -F '\t| *, *' '{ for (i=2; i<=NF; ++i) { print $i"\t"$1 } }'
然后我们要应用您的排序顺序并消除重复项。我们使用 bash 功能将制表符指定为分隔符 (-t $'\t')。如果您使用的是 Bourne/POSIX shell,则需要使用 '[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 工具进行了测试。