免费注册 查看新帖 |

Chinaunix

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

超多字段的文本想使用awk分裂为多个文件,寻求帮助! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-12-30 15:26 |只看该作者 |倒序浏览
我在处理数据过程中,有一个文件字段数达588个,在Windows下要导入Access,但Access最大支持字段数255个,无法直接导入,故希望将此源文件每行按200个字段(因后续处理还需增加一些字段,不能用最大字段数)分裂后输出到三个文件中,而且每个输出文件的前三个字段都取自源文件对应行的第一个字段中"/"分开的三个数字部分!
当然还有个条件就是,只输出源文件中"BTS"字符起始的行!

源文件内容如下:


目标文件一则为:
20,1,0,1068,1.46,7,10520,7201,0,0    即源文件第一字段分裂为3个字段,后续为源文件第2-200字段
20,1,1,191,0.28,5,2014,7201,0,0
20,1,2,224,0.31,4,2263,7201,0,0

....
目标文件二则为:
20,1,0,...   即源文件第一字段分裂为3个字段,后续为源文件第201-399字段
20,1,1,...
20,1,2,...

目标文件二则为:
20,1,0,...   即源文件第一字段分裂为3个字段,后续为源文件第400-588字段
20,1,1,...
20,1,2,...


看了网上和论坛上的相关帖子,但是基础太弱,始终没有看明白,希望高人指点,再根据指点总结学习!先谢了!

论坛徽章:
0
2 [报告]
发表于 2008-12-30 15:46 |只看该作者
没人回竟然。
呵呵 大多数是588个字段的 ;但是有一个是587个字段
这个怎么处理?

论坛徽章:
0
3 [报告]
发表于 2008-12-30 15:48 |只看该作者
告诉你个秘方 就是 给点积分 绝多嗷嗷多的人帮你

论坛徽章:
1
2015年亚洲杯之韩国
日期:2015-04-24 09:07:02
4 [报告]
发表于 2008-12-30 15:50 |只看该作者

回复 #3 nuclearxin 的帖子

呵呵 实在是没看懂lz说的 东一头西一头的看的迷迷糊糊的

论坛徽章:
3
戌狗
日期:2014-09-10 17:07:162015年辞旧岁徽章
日期:2015-03-03 16:54:15wusuopu
日期:2016-06-17 17:43:45
5 [报告]
发表于 2008-12-30 15:50 |只看该作者
原帖由 nuclearxin 于 2008-12-30 15:48 发表
告诉你个秘方 就是 给点积分 绝多嗷嗷多的人帮你

他只有1分

论坛徽章:
0
6 [报告]
发表于 2008-12-30 15:51 |只看该作者
原帖由 ynchnluiti 于 2008-12-30 15:50 发表

他只有1分

没注意
1分给我我也要~~@)

论坛徽章:
1
2015年亚洲杯之韩国
日期:2015-04-24 09:07:02
7 [报告]
发表于 2008-12-30 15:57 |只看该作者

回复 #6 nuclearxin 的帖子

你这说句话都2分了

论坛徽章:
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
8 [报告]
发表于 2008-12-30 15:57 |只看该作者

回复 #1 metaxing 的帖子

思路都知道了,就是代码实现了贝。写3个循环就好了。

awk -F, '/^BTS/{split($1,a,"[ /]");
printf a[2]","a[3]","a[4] > "file1"
for(i=2;i<=200;i++) printf ","$i > "file1"
print "" > "file1"
printf a[2]","a[3]","a[4] > "file2"
for(i=201;i<=399;i++) printf ","$i > "file2"
print "" > "file2"
printf a[2]","a[3]","a[4] > "file3"
for(i=400;i<=NF;i++) printf ","$i > "file3"
print "" > "file3"
}' urfile

当然这段代码是可以优化的,比如a[2]","a[3]","a[4]可以用个变量,循环可以写一个,然后文件名用变量。

[ 本帖最后由 ly5066113 于 2008-12-30 16:01 编辑 ]

论坛徽章:
0
9 [报告]
发表于 2008-12-30 15:57 |只看该作者
原来的ID丢了,找不回来了,只有重头再来,没关系,不管是多少个都可以送出去!马上找找怎么改悬赏分!
只希望自己把以前的知识能够重拾回来!

论坛徽章:
0
10 [报告]
发表于 2008-12-30 15:58 |只看该作者
200个字段分割
awk '{for (i=1;i<=200;i++) printf $i"\t" > "1.txt";printf "\n";
for (i=201;i<=400;i++) printf $i"\t" > "2.txt";printf "\n";
for (i=401;i<=NF;i++) printf $i"\t" > "3.txt";printf "\n"}' ufile
死办法,要是想通用性更强,可以使用i%200来自动生成文件名,不过我偷懒了

[ 本帖最后由 jinl 于 2008-12-30 16:07 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP