免费注册 查看新帖 |

Chinaunix

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

[已完美解决]求助:如何将多行文本中行首指定字符串的行输出到目标文件中 [复制链接]

求职 : 技术支持/维
论坛徽章:
0
1 [报告]
发表于 2010-07-15 10:50 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
2 [报告]
发表于 2010-07-15 11:26 |只看该作者
非常感谢,我在windows下使用的
1 perl -ne 'print if /^ADD CELLSETUP/' file
将脚本文件稍微改动后如下,运行结果ok
!D:/Program/perl/perl -w
perl -ne "print if /^ADD CELLSETUP/" <CFGMML-1A.TXT>; CELLSETUP.CSV

其他方式继续研究中,主要是对不同系统下一些特殊字符的转换不甚了解.

如有转换规律也请指教

论坛徽章:
0
3 [报告]
发表于 2010-07-15 11:31 |只看该作者
第二种方式
[oracle@imeg02 zgw]$ perl -nle 'BEGIN{$,=",";print "CELLID, CELLNAME, CNOPINDEX, MAXTXPOWER, BANDIND, UARFCNUPLINKIND, UARFCNUPLINK"}print $1,$2,$3,$4,$5,$6,$7 if /^ADD CELLSETUP:\w+=(.*),\s*\w+=(.*),\s*\w+=(.*),\s*\w+=(.*),\s*\w+=(.*),\s*\w+=(.*),\s*\w+=(.*);/'  file        

在windows转换为如下脚本:
!D:/Program/perl/perl -w
perl -nle "BEGIN{$,=',';print 'CELLID, CELLNAME, CNOPINDEX, MAXTXPOWER, BANDIND, UARFCNUPLINKIND, UARFCNUPLINK'}print $1,$2,$3,$4,$5,$6,$7 if /^ADD CELLSETUP:\w+=(.*),\s*\w+=(.*),\s*\w+=(.*),\s*\w+=(.*),\s*\w+=(.*),\s*\w+=(.*),\s*\w+=(.*);/"  <CFGMML-A-20100712104323.TXT>; CELLSETUP2.CSV
运行结果如下:
CELLID, CELLNAME, CNOPINDEX, MAXTXPOWER, BANDIND, UARFCNUPLINKIND, UARFCNUPLINK
11, CELLNAME="AAAAA-1", CNOPINDEX=0, MAXTXPOWER=430, BANDIND=BAND1, UARFCNUPLINKIND=TRUE, UARFCNUPLINK=9763
首行标题行肯定没问题,但是之后的值行只有首列值获取正常,请问还需要对何处进行修正方可正常.

求职 : 技术支持/维
论坛徽章:
0
4 [报告]
发表于 2010-07-15 12:33 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

求职 : 技术支持/维
论坛徽章:
0
5 [报告]
发表于 2010-07-15 13:37 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
6 [报告]
发表于 2010-07-15 14:11 |只看该作者
本帖最后由 metaxing 于 2010-07-15 14:45 编辑

首先我是在windows下用类似DOS批处理的形式执行的,比如脚本文件名rnc.cmd,内容如下
!D:/Program/perl/perl -w
perl -ne "print if /^ADD CELLSETUP/" <CFGMML-A.TXT>; CELLSETUP.CSV
perl -nle "BEGIN{$,=',';print 'CELLID, CELLNAME, CNOPINDEX, MAXTXPOWER, BANDIND, UARFCNUPLINKIND, UARFCNUPLINK'}print $1,$2,$3,$4,$5,$6,$7 if /^ADD CELLSETUP:\w+=(.*),\s*\w+=(.*),\s*\w+=(.*),\s*\w+=(.*),\s*\w+=(.*),\s*\w+=(.*),\s*\w+=(.*);/"  <CFGMML-A.TXT>; CELLSETUP2.CSV
perl -nle "BEGIN{$,=',';print 'RNC,CELLID,CELLNAME,CNOPINDEX,MAXTXPOWER,BANDIND,UARFCNUPLINKIND,UARFCNUPLINK,UARFCNDOWNLINK,TCELL,NINSYNCIND,NOUTSYNCIND,TRLFAILURE,PSCRAMBCODE,TXDIVERSITYIND,SPGID,NODEBNAME,LOCELL,LAC,SAC,CFGRACIND,RAC,CLTAMODEIND,CIO'};print 'GARNC1A', /=(.*?)[,;]/g if /^ADD CELLSETUP/"  <CFGMML-A.TXT>; CELLSETUP3.CSV

第一行perl执行如期所欲,一切OK
第二行perl执行结果如下:
CELLID, CELLNAME, CNOPINDEX, MAXTXPOWER, BANDIND, UARFCNUPLINKIND, UARFCNUPLINK
11, CELLNAME="AAAAA-1", CNOPINDEX=0, MAXTXPOWER=430, BANDIND=BAND1, UARFCNUPLINKIND=TRUE, UARFCNUPLINK=9763
与您在dos提示符下的结果有出入,不知何故
第三行perl脚本照楼上示例稍加改变执行结果已经非常完美,结果成这样:
RNC,CELLID,CELLNAME,CNOPINDEX,MAXTXPOWER,BANDIND,UARFCNUPLINKIND,UARFCNUPLINK,UARFCNDOWNLINK,TCELL,NINSYNCIND,NOUTSYNCIND,TRLFAILURE,PSCRAMBCODE,TXDIVERSITYIND,SPGID,NODEBNAME,LOCELL,LAC,SAC,CFGRACIND,RAC,CLTAMODEIND,CIO
GARNC1A,11,"AAAAA-1",0,430,BAND1,TRUE,9763,10713,CHIP0,5,50,50,264,FALSE,1,"AAAAA",0,H'F183,H'000B,REQUIRE,H'01,FALSE,0

但是我还有一个原文件需要同样转换后追加到前一步生成结果的后面,这次不要标题行了,我写如下脚本
perl -nle "BEGIN{$,=',';print 'GARNC1B', /=(.*?)[,;]/g if /^ADD CELLSETUP:/"  <CFGMML-B.TXT>; >>CELLSETUP.CSV
但是执行没有追加任何信息,错误何在?

论坛徽章:
0
7 [报告]
发表于 2010-07-15 21:19 |只看该作者
楼上第二行脚本在DOS的命令行下执行结果是好的,但是放在cmd的dos脚本内就不正确.

不过第三行脚本已经可以达到目的了

现在就剩追加仍然没有成功,不知下面脚本有何问题.
perl -nle "BEGIN{$,=',';print 'GARNC1B', /=(.*?)[,;]/g if /^ADD CELLSETUP:/"  <CFGMML.TXT>; >>CELLSETUP.CSV

另外内部替换也OK了
perl -pi -e"s/UARFCNUPLINKIND=FALSE/UARFCNUPLINKIND=FALSE, UARFCNUPLINK=9763/" <CFGMML-A.TXT>; CFGMML0.TXT
perl -pi -e"s/CFGRACIND=NOT_REQUIRE/CFGRACIND=NOT_REQUIRE, RAC=0/" <CFGMML0.TXT>; CFGMML.TXT

非常感谢99超人兄,最后一个追加问题还有待坛友相助.

论坛徽章:
0
8 [报告]
发表于 2010-07-16 17:15 |只看该作者
问题在99超人的帮助下,已经全部完美解决
总结:
1.字符替换 将CFGMML-A.TXT文件中"UARFCNUPLINKIND=FALSE"字符串替换为"UARFCNUPLINKIND=FALSE, UARFCNUPLINK=9763",其他内容保持不变
perl -pi -e "s/UARFCNUPLINKIND=FALSE/UARFCNUPLINKIND=FALSE, UARFCNUPLINK=9763/" <CFGMML-A.TXT>; CFGMML0.TXT
2.将指定字符"BLK CELL:/"开始的行,其中=之前字符为标题,=之后为值,以逗号分隔的内容输出新到文件中,且在首列增加一列指定标题和值
perl -nle "BEGIN{$,=',';print 'RNC,CELLID'};print 'GARNC1A', /=(.*?)[,;]/g if /^BLK CELL:/"  <CFGMML.TXT>; BLKCELL.CSV
即将如下内容
BLK CELL:CELLID=1402;
转换为
RNC,CELLID
GARNC1A,1402
3.追加输出
perl -nle "BEGIN{$,=','};print 'GARNC1B', /=(.*?)[,;]/g if /^BLK CELL:/"  CFGMML.TXT >>BLKCELL.CSV
输入文件名前后不得像新建输出文件一样再用<>;了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP