Хотя ответ pixelbeat работает, я не могу сказать, что я в восторге от этого. Я думаю, что я использовал бы awk что-то вроде этого:
{ for (i=2; i<=NF; i++) { lines[$1] = lines[$1] " " $i;} }
END { for (i in lines) printf("%s%s\n", i, lines[i]); }
Это не требует предварительной сортировки данных и должно работать нормально независимо от количества или длины полей (конечно, если не считать переполнения памяти). Единственный очевидный недостаток - вывод в произвольном порядке. Если вам нужна сортировка, вам нужно будет направить вывод через сортировку (но возврат к исходному порядку был бы чем-то другим).