免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2595 | 回复: 13
打印 上一主题 下一主题

[文本处理] 【已解决】【sed】合并多行的问题 [复制链接]

论坛徽章:
1
2015亚冠之塔什干棉农
日期:2015-09-10 14:27:55
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-08-12 15:13 |只看该作者 |倒序浏览
本帖最后由 通幽tongyou 于 2015-08-14 17:37 编辑

遇到了一个这样的问题,有一个名为testcorrection.txt的文件,内容如下:
| CN010645 || RELEASE || PRFILEGX.PAC 15.67-0    &DIPT IMG
ABCDEFG.PAC 9.8-0    &Q IMG
HIGKLMN.PAC 2.4-0    &Q IMG
|| Lily (lily@sina.com) || GROUP1 ||  Accepted |
| CN010851 || RELEASE || PRFILEGX.PAC 15.67-0    &DIPT IMG
OPQRSTU.PAC 4.57-0    &DIPT IMG
ISLEJXIL.PAC 9.8-0    &Q IMG
|| zhangli(zhangli@sina.com) || GROUP2 || Accepted |

目的是处理完之后的文件内容是这样的:
| CN010645 || RELEASE || PRFILEGX.PAC 15.67-0    ,ABCDEFG.PAC 9.8-0    ,HIGKLMN.PAC 2.4-0    ,|| Lily (lily@sina.com) || GROUP1 ||  Accepted |
| CN010851 || RELEASE || PRFILEGX.PAC 15.67-0    ,OPQRSTU.PAC 4.57-0    ,ISLEJXIL.PAC 9.8-0    ,|| zhangli(zhangli@sina.com) || GROUP2 || Accepted |

思想是这样的:
1)找到以IMG结尾的行
2)找到IMG结尾的行之后,IMG和它之前的那几个字符(比如&Q IMG或者&DIPT IMG)替换为空格
3)如果成功的话,跳转到标签:a
4) 标签a内容:读取下一行,并且把行尾的\n替换为逗号
5)现在文本文件中是有两段
    | CN010645.....
     .............
    ||Lily
    这样的内容,我把寻址的地址设置为了/^\| CN/,/^ \|\|/  是以| CN开头的地址开始,一直到以||开头的开始结束
【我是想设置这样的寻址,会相当于一个循环,对两段的| CN.. 都会做相同的处理】

我是这样写的:
sed -i "/^\| CN/,/^ \|\|/{:a;N;s/\n/,/g;/IMG$/s#.\{6\}IMG# #g;ta;}" testcorrection.txt

但是输出结果是这样的:
| CN010645 || RELEASE || PRFILEGX.PAC 15.67-0    ,ABCDEFG.PAC 9.8-0    ,HIGKLMN.PAC 2.4-0    ,|| Lily (lily@sina.com) || GROUP1 ||  Accepted |,| CN010851 || RELEASE || PRFILEGX.PAC 15.67-0    ,OPQRSTU.PAC 4.57-0    ,ISLEJXIL.PAC 9.8-0    ,|| zhangli(zhangli@sina.com) || GROUP2 || Accepted |

把所有的内容都连在了一起。

各位能帮忙看一下吗,是哪里需要改动的,谢谢了!

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
2 [报告]
发表于 2015-08-12 15:26 |只看该作者
回复 1# 通幽tongyou

$ awk '{if($NF=="IMG"){NF-=2;s=s c $0;c="   ,"}else{print s c $0;s=c=""}}' testcorrection.txt
| CN010645 || RELEASE || PRFILEGX.PAC 15.67-0   ,ABCDEFG.PAC 9.8-0   ,HIGKLMN.PAC 2.4-0   ,|| Lily (lily@sina.com) || GROUP1 ||  Accepted |
| CN010851 || RELEASE || PRFILEGX.PAC 15.67-0   ,OPQRSTU.PAC 4.57-0   ,ISLEJXIL.PAC 9.8-0   ,|| zhangli(zhangli@sina.com) || GROUP2 || Accepted |

   

论坛徽章:
20
卯兔
日期:2015-01-26 22:05:142015亚冠之萨济拖拉机
日期:2015-09-10 15:15:282015亚冠之阿尔希拉尔
日期:2015-09-25 17:37:53程序设计版块每日发帖之星
日期:2015-10-03 06:20:00程序设计版块每日发帖之星
日期:2015-12-09 06:20:00CU十四周年纪念徽章
日期:2015-12-17 09:07:15程序设计版块每日发帖之星
日期:2015-12-25 06:20:34程序设计版块每日发帖之星
日期:2015-12-25 06:20:34程序设计版块每日发帖之星
日期:2015-12-25 06:20:342015亚冠之广州富力
日期:2015-08-27 19:29:56每日论坛发贴之星
日期:2015-08-26 06:20:002015亚冠之阿尔希拉尔
日期:2015-05-18 17:26:27
3 [报告]
发表于 2015-08-12 15:56 |只看该作者
回复 1# 通幽tongyou
  1. sed -r '/^\| CN/{:1;N;s#([^&]+)[^\n]*\n([^&]+).*#\1,\2#;/,\|\|/b;t1;}' file
复制代码

论坛徽章:
20
卯兔
日期:2015-01-26 22:05:142015亚冠之萨济拖拉机
日期:2015-09-10 15:15:282015亚冠之阿尔希拉尔
日期:2015-09-25 17:37:53程序设计版块每日发帖之星
日期:2015-10-03 06:20:00程序设计版块每日发帖之星
日期:2015-12-09 06:20:00CU十四周年纪念徽章
日期:2015-12-17 09:07:15程序设计版块每日发帖之星
日期:2015-12-25 06:20:34程序设计版块每日发帖之星
日期:2015-12-25 06:20:34程序设计版块每日发帖之星
日期:2015-12-25 06:20:342015亚冠之广州富力
日期:2015-08-27 19:29:56每日论坛发贴之星
日期:2015-08-26 06:20:002015亚冠之阿尔希拉尔
日期:2015-05-18 17:26:27
4 [报告]
发表于 2015-08-12 16:09 |只看该作者
回复 1# 通幽tongyou
sed -r '/^\| CN/,/^\|\|/{:a;N;s/\n/,/g;/IMG$/s#.{6}IMG# #g;/,\|\|/b;ta;}' file,
加上跳出循环的判断就可以了。。。

论坛徽章:
11
射手座
日期:2015-08-11 16:10:26辰龙
日期:2015-08-11 16:11:11黑曼巴
日期:2016-04-26 16:58:40
5 [报告]
发表于 2015-08-12 16:18 |只看该作者
本帖最后由 hjfeng1988 于 2015-08-12 16:23 编辑

sed  '/^| CN/{:a;N;s/\n/,/;/,||/!ba;s/&DIPT IMG\|&Q IMG//g}' file

sed '/^| CN/{:a;N;/\n||/!ba;s/\n/,/g;s/&DIPT IMG\|&Q IMG//g}' file

论坛徽章:
1
2015亚冠之塔什干棉农
日期:2015-09-10 14:27:55
6
发表于 2015-08-12 17:35
试了一下,
$sed -i "/^\| CN/,/^ \|\|/{:a;N;s/\n/,/g;/,\| CN/! ba;/IMG$/s#.\{6\}IMG# #g;ta;}" testcorrection.txt

你的意思是不是这样的:
/,\| CN/! ba
当与这个模式/,\| CN/匹配上了,就不跳转到a,匹配不上的时候,就跳转到a

我试了一下,输出结果还是一样的呢。

回复 5# hjfeng1988


   

论坛徽章:
1
2015亚冠之塔什干棉农
日期:2015-09-10 14:27:55
7 [报告]
发表于 2015-08-12 17:37 |只看该作者
试了还是不行啊,这个模式匹配
/,\|\|/b;  是要匹配哪里的?
回复 4# songyc_2015


   

论坛徽章:
1
2015亚冠之塔什干棉农
日期:2015-09-10 14:27:55
8 [报告]
发表于 2015-08-12 17:37 |只看该作者

这种方法可以的,但是我没看懂
回复 2# jason680


   

论坛徽章:
20
卯兔
日期:2015-01-26 22:05:142015亚冠之萨济拖拉机
日期:2015-09-10 15:15:282015亚冠之阿尔希拉尔
日期:2015-09-25 17:37:53程序设计版块每日发帖之星
日期:2015-10-03 06:20:00程序设计版块每日发帖之星
日期:2015-12-09 06:20:00CU十四周年纪念徽章
日期:2015-12-17 09:07:15程序设计版块每日发帖之星
日期:2015-12-25 06:20:34程序设计版块每日发帖之星
日期:2015-12-25 06:20:34程序设计版块每日发帖之星
日期:2015-12-25 06:20:342015亚冠之广州富力
日期:2015-08-27 19:29:56每日论坛发贴之星
日期:2015-08-26 06:20:002015亚冠之阿尔希拉尔
日期:2015-05-18 17:26:27
9 [报告]
发表于 2015-08-12 17:40 |只看该作者
回复 7# 通幽tongyou
我测试没有问题。。。

QQ图片20150812173622.png (27.23 KB, 下载次数: 39)

hhh

hhh

论坛徽章:
20
卯兔
日期:2015-01-26 22:05:142015亚冠之萨济拖拉机
日期:2015-09-10 15:15:282015亚冠之阿尔希拉尔
日期:2015-09-25 17:37:53程序设计版块每日发帖之星
日期:2015-10-03 06:20:00程序设计版块每日发帖之星
日期:2015-12-09 06:20:00CU十四周年纪念徽章
日期:2015-12-17 09:07:15程序设计版块每日发帖之星
日期:2015-12-25 06:20:34程序设计版块每日发帖之星
日期:2015-12-25 06:20:34程序设计版块每日发帖之星
日期:2015-12-25 06:20:342015亚冠之广州富力
日期:2015-08-27 19:29:56每日论坛发贴之星
日期:2015-08-26 06:20:002015亚冠之阿尔希拉尔
日期:2015-05-18 17:26:27
10 [报告]
发表于 2015-08-12 17:42 |只看该作者
回复 7# 通幽tongyou
估计你是没有加-r选项吧,sed -r 'xxxx' file
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP