Unixにマージ

Unixにマージ

|以下のように、区切り記号としてパイプ()を持つ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

出力する前に、パターン空間のすべてのラインに適用されます。これにより、パイプ記号の周りのすべてのスペースが削除されます。

おすすめ記事