免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: metaxing
打印 上一主题 下一主题

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

论坛徽章:
0
11 [报告]
发表于 2008-12-30 16:10 |只看该作者
原帖由 ly5066113 于 2008-12-30 15:57 发表
思路都知道了,就是代码实现了贝。写3个循环就好了。

awk -F, '/^BTS/{split($1,a,"[ /]");
printf a[2]","a[3]","a[4] > "file1"
for(i=2;i "file1"
print "" > "file1"
printf a[2]","a[3]","a[4] > " ...

输出用追加的比较好吧

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

回复 #11 我是DBA 的帖子

为何?文件句柄不关闭,就一直处于打开的状态。
> 和 >> 只是在打开文件时有区别。

论坛徽章:
3
戌狗
日期:2014-09-10 17:07:162015年辞旧岁徽章
日期:2015-03-03 16:54:15wusuopu
日期:2016-06-17 17:43:45
13 [报告]
发表于 2008-12-30 16:22 |只看该作者
我没用那么多字段测试。
cat bts
BTS 20/1/0,1,0,1068,1.46,7,10520,7201,0,0,191,0.28,5,2014,7201,0,0,224,0.31,4,2263,7201,0,0
BTS 20/1/1,1,0,1068,1.46,7,10520,7201,0,0,191,0.28,5,2014,7201,0,0,224,0.31,4,2263,7201,0,0
BTS 20/1/2,1,0,1068,1.46,7,10520,7201,0,0,191,0.28,5,2014,7201,0,0,224,0.31,4,2263,7201,0,0
BTS 20/2/0,1,0,1068,1.46,7,10520,7201,0,0,191,0.28,5,2014,7201,0,0,224,0.31,4,2263,7201,0,0
BTS 20/2/1,1,0,1068,1.46,7,10520,7201,0,0,191,0.28,5,2014,7201,0,0,224,0.31,4,2263,7201,0,0
BTS 20/2/2,1,0,1068,1.46,7,10520,7201,0,0,191,0.28,5,2014,7201,0,0,224,0.31,4,2263,7201,0,0

  1. awk 'BEGIN{FS=OFS=",";f1="out1";f2="out2";f3="out3";n=10;fs="out"}
  2. /^BTS/{
  3. sub(/.* /,"",$1);gsub(/\//, ",", $1);
  4. for(i=1;i<=3;i++)printf $1""OFS>fs""i;
  5. for(i=2;i<=NF;i++){
  6.     f=i>n&&i<2*n+1?f2:(i<=n?f1:f3);
  7.     printf "%s%s", $i, i%n&&i<NF?",":"\n" >f
  8. }
  9. }' bts
复制代码

论坛徽章:
0
14 [报告]
发表于 2008-12-30 16:41 |只看该作者
由于每个输出文件的前几个字段还需要都利用源文件的首字段,所以Tim的更切近目的,不过我还没有彻底弄明白!
问题:这段代码直接在命令行上使用,我将Gawk.exe程序拷贝到源文件和输出文件相同的目录,并将源文件名更新后,命令行如下:

Gawk -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"
}' "aOFS_BTS_P08000800"

在Windows的命令行提示:The system cannot find the file specified.

这里不知出何问题?
应该说Gawk在Windows下和在UNIX下是没有太大差别吧!

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

回复 #14 metaxing 的帖子

那还是写脚本吧。
unix下的单引号在Windows下要用双引号,反之也一样。

论坛徽章:
0
16 [报告]
发表于 2008-12-30 17:22 |只看该作者
看来Windows下和UNIX下的细微差别还是得注意,否则弄得莫名其妙不知道问题出在那里了!

先谢谢各位U友了,我会在节后逐一找U友直接交流,彻底弄懂,并将结果和理解更新在此贴上!
在此先谢各位了!以前稀里糊涂的照猫画虎已经越来越不行了,必须下功夫彻底弄明白才能真正做到举一反三!

在此也祝各位U友新年快乐!

论坛徽章:
3
戌狗
日期:2014-09-10 17:07:162015年辞旧岁徽章
日期:2015-03-03 16:54:15wusuopu
日期:2016-06-17 17:43:45
17 [报告]
发表于 2008-12-30 18:19 |只看该作者

回复 #16 metaxing 的帖子

修改了一下。

  1. awk 'BEGIN{FS=OFS=",";f1="out1";f2="out2";f3="out3";n=200;fs="out"}
  2. /^BTS/{
  3. sub(/.* /,"",$1);gsub(/\//, ",", $1);

  4. for(i=1;i<=((NF>2*n+1)?3:(NF>n?2:1));i++)printf $1""OFS>fs""i;
  5. for(i=2;i<=NF;i++){
  6.     f=(i>n&&i<2*n)?f2:(i<=n?f1:f3);
  7.     printf "%s%s", $i, (i!=n&&i!=2*n-1&&i<NF)?",":"\n" >f
  8. }
  9. }' bts
复制代码

论坛徽章:
3
戌狗
日期:2014-09-10 17:07:162015年辞旧岁徽章
日期:2015-03-03 16:54:15wusuopu
日期:2016-06-17 17:43:45
18 [报告]
发表于 2008-12-30 18:27 |只看该作者

回复 #17 ynchnluiti 的帖子

测试代码。把拆开的再合并。

  1. sed -i 's/\([0-9]*\),\([0-9]*\),\([0-9]*\)/BTS \1\/\2\/\3/' out1
  2. paste -d ',' out1 <(cut -d, -f4- out2) <(cut -d, -f4- out3)>ttt
  3. diff ttt bts |xargs -i printf "%.160s\n" {}
复制代码

或者vi -d ttt bts看看

论坛徽章:
0
19 [报告]
发表于 2008-12-30 19:56 |只看该作者
原帖由 ly5066113 于 2008-12-30 16:18 发表
为何?文件句柄不关闭,就一直处于打开的状态。
> 和 >> 只是在打开文件时有区别。

我错了,学习了,致敬。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP