Скопіюйте поле в першому стовпчику


1

Я маю нижченаведене введення

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           

Відповіді:


1

використання 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

1

Можливо так:

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

0

Чи постійні поля? Значення, кожне поле між; 's пов'язаними даними ... Якщо поля постійні, я особисто використовую базу даних, наприклад sqlite, і вставляю дані в db, а потім використовую запити для виведення даних так, як ви потрібно це. Ви також можете використовувати масив, а потім також упорядкувати поля у висновку.


так вони є. Мені потрібні лише команди Unix для дублювання поля в першій колонці
Тоні,

Формат даних вище - це не той формат даних, на який я відповів (повинен бути відредагований після того, як я відповів) ... моє рішення не працюватиме для вашого формату даних. Будь ласка, ігноруйте.
Карл Ліндгрен

0

Ще sed:

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

sedзберігає копію простору шаблону на hстарий простір, s///знімає весь простір шаблону і pвводить результати, а потім xзмінює hстарі та пробіли шаблону. Це трапляється в кожному непорожньому першому рядку поля і, де це доречно, отримує пробіли, що розділяються.

До кожного іншого рядка sedтакож Nдодається ext після вставленого \nроздільника ewline, а потім намагається s///усунути весь простір шаблону між першою крапкою з комою та останнім пробілом. Якщо обидва ці символи трапляються в просторі шаблонів, заміна є tуспішною, і sedповертається до :nмітки ext, щоб спробувати ще раз.

Else sed Dвибирає до і включає першу \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

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

sed -e: n -e '/./! n; $! n; /;. \ \ n *; /! d; s //; / p; tn' <in> out ця командна робота ідеальна. велике дякую
Тоні,

@Toufik - я думаю, що я скопіював / вставив це неправильно - у мене було переміщено порожні рядки Це має працювати зараз.
mikeserv

добре, це спрацювало навіть у попередній команді
Тоні,

@Toufik - гаразд! Так простіше, я знаю. Я відкотив її назад,
mikeserv
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.