私は次のような入力を持っています
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
\n
s///
t
sed
: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