1

我拥有的数据看起来像这样

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

发生的事情是,在字段 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'

如果前三列之一中有换行符,那将起作用。到目前为止,它还不适用于“行”中的多个换行符。

说明:
(^|\n)匹配行的开头(分别是换行符)
[^,]+,表示:至少一个(+表示一个或多个)字符!=“,”后跟一个“,”
([^,]+,){0,2}匹配如果有 0-2 列用“分隔” ,"
表示[^,]+在 0-2 列之后有一些(至少一个)字符!=","。
尾随\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 回答