Дублировать поле в первом столбце

Мне нужна помощь, пожалуйста. У меня есть следующий вход

L12194C; ;1;8;12 ;2;30;46 ;3;49;71 ;4;0;0 ;5;0;0 ;6;1;3 L15698A2; ;4;2;4 ;5;0;0 ;6;0;0 L2281A2; ;4;1;2 ;5;0;0 12302C; ;1;8;11 ;2;1;1 ;3;1;1 ;4;1;2 ;5;2;4 ;6;0;0 

Я хочу, чтобы результат был

 L12194C;1;8 ;12 L12194C;2;30;46 L12194C;3;49;71 L12194C;4;0;0 L12194C;5;0;0 L12194C;6;1;3 L15698A2;4;2;4 L15698A2;5;0;0 L15698A2;6;0;0 L2281A2;4;1;2 L2281A2;5;0;0 12302C;1;8;11 12302C;2;1;1 12302C;3;1;1 12302C;4;1;2 12302C;5;2;4 12302C;6;0;0 

использовать AWk :

 awk '!/^[[:blank:]]/{j=$1;print "";next}{print j$1}' FILENAME 

вывод:

 L12194C;;1;8;12 L12194C;;2;30;46 L12194C;;3;49;71 L12194C;;4;0;0 L12194C;;5;0;0 L12194C;;6;1;3 L15698A2;;4;2;4 L15698A2;;5;0;0 L15698A2;;6;0;0 L2281A2;;4;1;2 L2281A2;;5;0;0 12302C;;1;8;11 12302C;;2;1;1 12302C;;3;1;1 12302C;;4;1;2 12302C;;5;2;4 12302C;;6;0;0 

Может быть, вот так:

 sed -E ' 1{ h; d; } /^[^ \t]/{ h; s/.*//; p; d; } s/^[ \t]+;//; G; s/^(.*)\n(.*)$/\2\1/' 

Вывод:

 L12194C;1;8;12 L12194C;2;30;46 L12194C;3;49;71 L12194C;4;0;0 L12194C;5;0;0 L12194C;6;1;3 L15698A2;4;2;4 L15698A2;5;0;0 L15698A2;6;0;0 L2281A2;4;1;2 L2281A2;5;0;0 12302C;1;8;11 12302C;2;1;1 12302C;3;1;1 12302C;4;1;2 12302C;5;2;4 12302C;6;0;0 

Постоянны ли поля? Смысл, каждое поле между символами – это связанные данные … Если поля являются постоянными, лично, я бы использовал базу данных, такую ​​как sqlite, и вставлял данные в db, а затем использовал запросы для вывода данных так, как вы нужно это. Вы также можете использовать массив, а затем также упорядочивать поля на выходе.

Другой sed :

 sed -ne'h;s/.*//p;x;:n' -e'N;s/;.* //p;tn' -eD <in >out 

sed сохраняет копию пространства шаблонов в h старое пространство, s/// убирает все пространство шаблона и p обрабатывает результаты, затем e x изменяет h старых и пространства шаблонов. Это происходит в каждой непустой 1-й строке поля и, при необходимости, получает разделительные пробелы на выходе.

Для каждой другой строки sed также добавляет N ext после вставленного \n электронного ограничителя, затем пытается s/// оставить все пространство шаблона между первой точкой с запятой и последним пространством. Если оба этих символа встречаются в пространстве шаблонов, то замена выполняется успешно, а sed возвращается к метке :n ext, чтобы повторить попытку.

Else sed D eletes до и включая первый встречный \n ewline в пространстве шаблонов, прежде чем начинать с вершины с того, что осталось.

Мои результаты:

 L12194C; 1; 8; 12
 L12194C; 2; 30; 46
 L12194C; 3; 49; 71
 L12194C; 4; 0; 0
 L12194C; 5; 0; 0
 L12194C; 6; 1; 3

 L15698A2; 4; 2; 4
 L15698A2; 5; 0; 0
 L15698A2; 6; 0; 0

 L2281A2; 4; 1; 2
 L2281A2; 5; 0; 0

 12302C; 1; 8; 11
 12302C; 2; 1; 1
 12302C; 3; 1; 1
 12302C; 4; 1; 2
 12302C; 5; 2; 4