最初の列のフィールドをコピーします。

最初の列のフィールドをコピーします。

私は次のような入力を持っています

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

答え2

たぶん、次のようなものがあります。

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

答え3

フィールドは一定ですか?つまり、間のすべてのフィールドは関連データです...これらのフィールドが定数の場合、個人的にはsqliteなどのデータベースを使用してデータベースにデータを挿入し、データを出力する方法に従ってクエリを使用します。配列を使用して、この方法で出力のフィールドを並べ替えることもできます。

答え4

その他sed:

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

sedパターンスペースのコピーをh既存のスペースに保存し、s///すべてのパターンスペースを置き換えてp結果を印刷し、既存のスペースとパターンスペースをx変更します。hこれはすべての空でない最初のフィールド行で発生し、適切な場合は出力から区切りスペースを取得します。

他のすべての行の場合、extは挿入された改行区切り文字に追加され、最初のセミコロンとsed最後のスペースの間のすべてのパターンスペースを置き換えようとします。パターンスペースに両方の文字が表示された場合は、置換が成功し、再試行するためにextタグに再分岐します。N\ns///tsed:n

sed Dそれ以外の場合は、パターンスペースに最初に表示されるewlineが削除され、埋め込まれた後に最上部の残りの部分が使用されます。\n

私の結果:

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

関連情報