Chinaunix

标题: 求一个文本分割的shell脚本 [打印本页]

作者: psychymluo    时间: 2013-08-04 01:54
标题: 求一个文本分割的shell脚本
各位shell的专家们,大家好!

因为最近数据有点多,想用shell的脚本来把一个大的txt文档分割成若干个小的txt文档,如有赐教,不胜感激!

具体是,我有很多个名称为A的txt文档,A.txt有180行,每一行有3列数据,比如.....
116.761        2        1
128.755        2        1
138.763        2        1
178.762        2        1
190.771        2        1
226.75        2        1
304.764        2        1
360.759        2        1
374.77        2        1
404.761        2        1
45.937        2        1
73.926        2        1
109.939        2        1
117.929        2        1
167.936        2        1
189.937        2        1
203.932        2        1
281.945        2        1
343.945        2        1
379.941        2        1
...........
...........
我想做的是,将这个文档分成18个小的txt文档,每个小txt文档按顺序取10行.并且,前面6个文档名字分别命名为A_ag_run1 A_ag_run2...... A_ag_run6. 中间6个文档命名为 A_al_run1 A_al_run2...... A_al_run6,最后6个文档名字命名为A_an_run1 A_an_run2...... A_an_run6。


请教一下各位shell的高手,这个shell的脚本应该怎么写?多谢了!
作者: 关阴月飞    时间: 2013-08-04 02:34
回复 1# psychymluo
  1.   awk 'BEGIN{c[1]="g";c[2]="l";c[3]="n"}NR%10==1{++a;if(a%6==1){a=1;b++}}{print >"A_a"c[b]"_run"a}' urfile
复制代码

作者: psychymluo    时间: 2013-08-04 05:09
谢谢你快速的帮助!非常感谢!但是我把 awk 'BEGIN{c[1]="g";c[2]="l";c[3]="n"}NR%10==1{++a;if(a%6==1){a=1;b++}}{print >"A_a"c"_run"a}' s002.txt 运行之后,出现了这个错误,

awk: syntax error at source line 1
context is
        BEGIN{c[1]="g";c[2]="l";c[3]="n"}NR%10==1{++a;if(a%6==1){a=1;b++}}{print >>>  >"A_a"c <<< "_run"a}
awk: illegal statement at source line 1

能不能麻烦你再帮忙看一下?

谢谢了!


回复 2# 关阴月飞


   
作者: 关阴月飞    时间: 2013-08-04 13:03
本帖最后由 关阴月飞 于 2013-08-04 13:06 编辑
psychymluo 发表于 2013-08-04 05:09
谢谢你快速的帮助!非常感谢!但是我把 awk 'BEGIN{c[1]="g";c[2]="l";c[3]="n"}NR%10==1{++a;if(a%6==1){a ...



"{print >"A_a"c"_run"a}' s002.txt 运行之后,出现了这个错误,"


这里的c是个数组,引用的时候少了下标,应该是
  1. c[b]
复制代码

作者: reyleon    时间: 2013-08-04 15:24
本帖最后由 reyleon 于 2013-08-04 15:29 编辑
  1. awk 'BEGIN{a[1]="A_ag_run";a[2]="A_al_run";a[3]="A_an_run"}NR%10==1{i++;if(i%6==1){i=1;j++}}{print >a[j] i}'
复制代码
@关阴月飞  这问题我纠结了一下午,一直纠结在 NR%10==0 和 i%6==0 ,结果还是没搞出来   
作者: rdcwayx    时间: 2013-08-04 18:04
本帖最后由 rdcwayx 于 2013-08-04 20:09 编辑
关阴月飞 发表于 2013-08-04 04:34
回复 1# psychymluo
  1. BEGIN{c[1]="g";c[2]="l";c[3]="n"}
  2. to
  3. BEGIN{split("g,l,n",c,",")}
复制代码

作者: psychymluo    时间: 2013-08-04 23:26
本帖最后由 psychymluo 于 2013-08-04 23:48 编辑

感谢你们 ( 关阴月飞  rdcwayx reyleon ) 无私的帮助!



我把  关阴月飞 提供code修改了之后,运行

awk 'BEGIN{c[1]="g";c[2]="l";c[3]="n"}NR%10==1{++a;if(a%6==1){a=1;b++}}{print >"A_a"c[b1]"_run"a}' s002.txt,

不好意思,不知道怎么回事,我编辑帖子的时候是“({print >"A_a"c"_run"a}')” 是有"c[b1]"的,但是我发布出来的时候就自动没有了。其实我第一次和第二次运行的时候就有"c[b1]",由于b论坛似乎会自动省略,我在帖子里只好用c[b1]代替了。


还是出现同样的错误:


awk: syntax error at source line 1
context is
        BEGIN{c[1]="g";c[2]="l";c[3]="n"}NR%10==1{++a;if(a%6==1){a=1;b++}}{print >>>  >"A_a"c <<< "_run"a}
awk: illegal statement at source line 1

由于我还是shell的新手,真心不知道怎么动,手动起来又很麻烦,所以还想麻烦你们帮忙看一下,我把其中一个数据上传上来,可以尝试运行一下!

再次谢谢了!

祝愿好心人有好报!



s002.zip (1.2 KB, 下载次数: 10)
作者: reyleon    时间: 2013-08-04 23:51
  1. awk 'BEGIN{a[1]="A_ag_run";a[2]="A_al_run";a[3]="A_an_run"}NR%10==1{i++;if(i%6==1){i=1;j++}}{print >a[j] i}' s002.txt
复制代码
这个没问题呀,你直接复制代码块中的代码执行就好了

最近在学python,写了个python的,你也可以试试
  1. #!/usr/bin/python

  2. f = open('s002.txt')
  3. names = ['','A_ag_run','A_al_run','A_an_run']

  4. fn = 0
  5. nn = 0
  6. ln = 0

  7. for line in f.readlines():
  8.         ln += 1
  9.         if ln%10 == 1:
  10.                 fn += 1
  11.                 if fn%6 == 1:
  12.                         fn = 1
  13.                         nn += 1
  14.         d = open(names[nn]+str(fn),'a')
  15.         d.write(line)
复制代码

作者: psychymluo    时间: 2013-08-05 00:20
不好意思啊, 我是直接复制你的code在terminal里面回车,还是出现这个错误,不知道怎么回事?你那里可以运行吗?好奇怪!

还是很感谢了!

awk: syntax error at source line 1
context is
        BEGIN{a[1]="A_ag_run";a[2]="A_al_run";a[3]="A_an_run"}NR%10==1{i++;if(i%6==1){i=1;j++}}{print >a[j] >>>  i <<< }
awk: illegal statement at source line 1


回复 8# reyleon


   
作者: 关阴月飞    时间: 2013-08-05 09:22
回复 7# psychymluo

话说lz是在什么环境下做的测试?
  1. [root@ test]# wc -l file
  2. 180 file
  3. [root@ test]#   awk 'BEGIN{c[1]="g";c[2]="l";c[3]="n"}NR%10==1{++a;if(a%6==1){a=1;b++}}{print >"A_a"c[b]"_run"a}' file
  4. [root@ test]# ls -1
  5. A_ag_run1
  6. A_ag_run2
  7. A_ag_run3
  8. A_ag_run4
  9. A_ag_run5
  10. A_ag_run6
  11. A_al_run1
  12. A_al_run2
  13. A_al_run3
  14. A_al_run4
  15. A_al_run5
  16. A_al_run6
  17. A_an_run1
  18. A_an_run2
  19. A_an_run3
  20. A_an_run4
  21. A_an_run5
  22. A_an_run6
  23. file
  24. [root@ test]# wc A_a* file  -l
  25.   10 A_ag_run1
  26.   10 A_ag_run2
  27.   10 A_ag_run3
  28.   10 A_ag_run4
  29.   10 A_ag_run5
  30.   10 A_ag_run6
  31.   10 A_al_run1
  32.   10 A_al_run2
  33.   10 A_al_run3
  34.   10 A_al_run4
  35.   10 A_al_run5
  36.   10 A_al_run6
  37.   10 A_an_run1
  38.   10 A_an_run2
  39.   10 A_an_run3
  40.   10 A_an_run4
  41.   10 A_an_run5
  42.   10 A_an_run6
  43. 180 file
  44. 360 总计
复制代码

作者: 关阴月飞    时间: 2013-08-05 09:27
回复 7# psychymluo


    刚下载了lz上传的文本,可能是文件格式问题,还是那句老话:先转化一下格式再说吧
作者: psychymluo    时间: 2013-08-05 23:02
谢谢!问题已经解决了,原来是文本格式的问题,我是在mac环境下测试的,多谢你的帮助!回复 10# 关阴月飞


   
作者: davidbeckham921    时间: 2013-08-06 10:44
比splite智能啊




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2