|
以下のように、区切り記号としてパイプ()を持つCSVファイルがあります。Unixではマージ技術を適用する必要があります。ファイルには数十万のレコード(4つのフィールド)が含まれていますが、読みやすくするために5つのレコードしか提供していません。
field1 |field2 | field3 |field4|
1|abc|def|ghi|
4|ijk|
|lmn|
5||opq|rst|
8|
uvw||xyz|
10|hjg|jsh|nbm|
出力が欲しいです。
field1|field2|field3|field4|
1|abc|def|ghi|
4|ijk||lmn|
5||opq|rst|
8|uvw||xyz|
10|hjg|jsh|nbm|
ベストアンサー1
GNU sedの使用:
sed ':loop /\(.*|\)\{4\}.*/ !{N; s/\n//; b loop}; s/ *| */|/g' file
このコマンドの分析:
:loop
この:
信号は分岐に使用できるラベルを表します。 "loop"は私がラベルとして選択した名前です。
/\(.*|\)\{4\}.*/
4つのパイプシンボルを含む行に一致する行セレクタ正規表現。各パイプシンボルの前には0個以上のランダム文字が許可され、.*|
最後のパイプの後には0個以上のランダム文字が許可されます。
!{ ... }
実行されたすべての行に括弧内のコマンドを適用します。いいえ前の正規表現に一致します。
N; s/\n//; b loop
N
現在の行に参加パターン空間ソースファイルから改行と次の行を使用して改行をs/\n//
削除し、b loop
最初に定義したラベルに再分岐すると、関連付けられた行が正規表現と再比較されます。
ついに
s/ *| */|/g
出力する前に、パターン空間のすべてのラインに適用されます。これにより、パイプ記号の周りのすべてのスペースが削除されます。