免费注册 查看新帖 |

Chinaunix

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

[文本处理] 求助:项目中字符串处理问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-01-14 14:59 |只看该作者 |倒序浏览
最近在用shell做个文件传输的脚本,文件中字符串遇到了问题

表结构为:
机构号(9位),设备编号(16位),账号(28位),金额(15位)

用DB2导出表数据到文件的格式:
"900009991","16668e0011240043","1223190223322790",+0000000000005.00
"900009994","46668e0011240043","4223190223322790123456",+0000000000005.00

目前能做到的文件格式:
90000999116668e00112400431223190223322790000000000000500
90000999446668e00112400434223190223322790123456000000000000500

要求的文件格式:每个字段定长传输,如前9位为机构号,10到25位为设备编号。但是账号的长度不一,所以要求账号字段不满28位的后面用空格补齐:
90000999116668e00112400431223190223322790            000000000000500
90000999446668e00112400434223190223322790123456      000000000000500

项目中用到的,改账号字段成char已经不可能了,会影响别人使用。
新人刚入门,一直在边做边学。求教各位大神,有没有解决方法?

论坛徽章:
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-01-14 15:09 |只看该作者
回复 1# 请叫我小五

would you like this way with %-28s

  1. $ awk -F, '{gsub("\"","");printf("%9s%16s%-28s%015d\n",$1,$2,$3,$4*100)}' FILE
  2. 90000999116668e00112400431223190223322790            000000000000500
  3. 90000999446668e00112400434223190223322790123456      000000000000500
复制代码

   

论坛徽章:
769
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
3 [报告]
发表于 2015-01-14 15:17 |只看该作者
回复 1# 请叫我小五
  1. cat i
  2. "900009991","16668e0011240043","1223190223322790",+0000000000005.00
  3. "900009994","46668e0011240043","4223190223322790123456",+0000000000005.00
复制代码
  1. awk 'BEGIN{FS=OFS=",";a[1]=9;a[2]=16;a[3]=28;a[4]=15}{for(i=1;i<=NF;i++){gsub(/^\"|\"$/,"",$i);while(length($i)<a[i])$i=$i" "}}1' i
  2. 900009991,16668e0011240043,1223190223322790            ,+0000000000005.00
  3. 900009994,46668e0011240043,4223190223322790123456      ,+0000000000005.00
复制代码

论坛徽章:
769
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
4 [报告]
发表于 2015-01-14 15:33 |只看该作者
回复 2# jason680

审错题了,应该是这样...
   

论坛徽章:
30
申猴
日期:2014-04-10 09:43:532015年亚洲杯纪念徽章
日期:2015-03-20 14:40:232015亚冠之阿尔纳斯尔
日期:2015-06-02 18:59:042015亚冠之阿尔希拉尔
日期:2015-06-30 15:22:572015亚冠之大阪钢巴
日期:2015-07-20 10:44:332015亚冠之阿尔纳斯尔
日期:2015-10-28 14:57:5215-16赛季CBA联赛之新疆
日期:2015-12-25 10:18:45黑曼巴
日期:2016-06-26 21:39:5315-16赛季CBA联赛之山西
日期:2016-07-25 21:54:2715-16赛季CBA联赛之北京
日期:2016-10-27 12:07:2315-16赛季CBA联赛之八一
日期:2017-07-07 16:39:0915-16赛季CBA联赛之吉林
日期:2017-09-04 12:14:43
5 [报告]
发表于 2015-01-14 16:36 |只看该作者
  1. awk -F '[",+.]' '{for (i=1;i<=NF;i++) {if(i==8){split($8,a,"");if(length(a)==28){printf $8} else if(length(a)<28) {printf $8;for (j=1;j<=28-length(a);j++) {printf " "}}} else {printf $i}}print ""}' file
  2. 90000999116668e00112400431223190223322790            000000000000500
  3. 90000999446668e00112400434223190223322790123456      000000000000500
复制代码
回复 1# 请叫我小五


   

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
6 [报告]
发表于 2015-01-14 17:03 |只看该作者
回复 1# 请叫我小五


DB2 导出的时候不要用 del 格式,用 asc 格式就可以了。

论坛徽章:
0
7 [报告]
发表于 2015-01-21 10:38 |只看该作者
回复 6# ly5066113


    谢谢,试了这种方法可行且最简单,不过带空格会影响别人使用,这种方法被驳回了{:3_195:}

论坛徽章:
0
8
发表于 2015-01-21 10:41
回复 2# jason680


    谢谢,还是觉得楼下的能看懂,所以暂时不用您这种方法了。。。

论坛徽章:
0
9
发表于 2015-01-21 10:42
回复 3# Herowinter


    谢谢,已经用了您的方法{:2_172:}

论坛徽章:
0
10 [报告]
发表于 2015-01-21 10:43 |只看该作者
回复 5# zxy877298415


    谢谢,觉得还是楼上的方法能看懂些,所以暂时不用您的方法了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP