Это решение GNU sed может работать для вас:
sed -rn '1{h;b};H;x;/^([^;]*);.*\n\1/!{s/.*\n//;x;d};s/\n/;/p' source_file
Предполагается, что пустых строк нет, иначе конвейер предварительно форматирует исходный файл с помощью sed '/^$/d' source_file
EDIT:
Если подумать, вышеупомянутое решение слишком сложное и может быть сжато до:
sed -ne '1{h;b};H;x;/^\([^;]*\);.*\1/s/\n/;/p' source_file
Объяснение:
-n
предотвращает неявную печать любых строк. Первая строка копируется в область удержания (HS дополнительный регистр), а затем делается разрыв, который завершает итерацию. Все последующие строки добавляются в ГС. HS поменялся местами с шаблоном (PS - регистр, содержащий текущую строку). HS в этой точке содержит предыдущие и текущие строки, которые теперь проверяются, чтобы увидеть, являются ли первые поля в каждой строке идентичными. Если это так, символ новой строки, разделяющий две строки, заменяется на ;
, и при условии замены произошла распечатка PS. Теперь выполняется следующая итерация, текущая строка обновляет PS, а HS - предыдущую.