1

私が持っているデータは次のようになります

a,b,c,d
a,b1
b2,c,d
A,B,C,D

何が起こっているかというと、フィールド 2 では 2 番目のフィールドに改行文字が時々あるため、行が 2 行に分割されます。

これまでのところ、これを行うsedスクリプトを見つけました

cat file| sed ':a;N;$!ba;s/\(\(b1\)\)\n/\1/g'

しかし、私はこれを機能させるために (.*,) の正しい組み合わせを取得するのに苦労しているので、この例を機能させるために b1 に置き換えましたが、現実の世界では A、B、C、および D は混合長のフィールドですとコンテンツ

私が探している最終結果はこれです

a,b,c,d
a,b1b2,c,d
A.B,C,D

どんな助けでも大歓迎です

ありがとうマット

4

2 に答える 2

2

私はここにまだ完璧ではない解決策を持っています-しかし私はそれについてさらに考えます。お使いのバージョンがsed拡張正規表現をサポートしている場合は、次のことができます。

cat file | sed -r ':a;N;$!ba;s/((^|\n)([^,]+,){0,2}[^,]+)\n/\1/g'

これは、最初の3列のいずれかに改行がある場合に機能します。これまでのところ、「行」内の複数の改行では機能しません。

説明:
(^|\n)行の先頭に一致する(または改行)
[^,]+,とは、少なくとも1つの(+1つ以上の鉱石を意味する)文字!= "、"の後に「、」が続くことを意味
([^,]+,){0,2}します。 、"
[^,]+、0〜2列の後にいくつかの(少なくとも1つの)文字!="、"があることを意味します。
末尾\nは改行と一致します

要約すると、sコマンドは0〜3列を含むすべての行に一致し、最後に改行があり\1、末尾の改行を除いてそれ自体()に置き換えられます。

于 2011-05-05T15:04:51.253 に答える
1

awkで

awk -F, 'NF < 4 {getline nextline; $0 = $0 nextline} 1' filename
于 2011-05-05T20:06:15.010 に答える