LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1428|回复: 8

cshell文件分割的问题[已解决]

[复制链接]
发表于 2004-3-24 16:58:53 | 显示全部楼层 |阅读模式
有如下格式的文件:test.txt
###-1000
1000,001,99,001
1000,001,99,001
1000,001,99,001
1000,001,99,001
###-2000
2000,001,99,001
2000,001,99,001
2000,001,99,001
2000,001,99,001
按照###-这个标识
分割成这样的文件:1000.txt,2000.txt
1000.txt的内容
1000,001,99,001
1000,001,99,001
1000,001,99,001
1000,001,99,001
2000.txt的内容
2000,001,99,001
2000,001,99,001
2000,001,99,001
2000,001,99,001
有何方法,请指教!
发表于 2004-3-24 17:24:50 | 显示全部楼层
最初由 javalee 发表
试试split ;)
  1. /home/javalee:cat test.txt
  2. ###-1000
  3. 1000,001,99,001
  4. 1000,001,99,001
  5. 1000,001,99,001
  6. 1000,001,99,001
  7. ###-2000
  8. 2000,001,99,001
  9. 2000,001,99,001
  10. 2000,001,99,001
  11. 2000,001,99,001
  12. /home/javalee:cat test.txt|tr -s '\n'|split -l5 #按照行数分割
  13. /home/javalee:ls xa?|while read i;do mv $i $(cat $i|sed -n 1p|cut -f2 -d"-").txt ;done
复制代码
split分隔出的文件默认前缀:xa
 楼主| 发表于 2004-3-24 17:27:49 | 显示全部楼层
不是按照行数是按照"###-"这个标识来分割的。
发表于 2004-3-24 17:30:55 | 显示全部楼层
最初由 sadan_l 发表
不是按照行数是按照"###-"这个标识来分割的。
因为你提供的数据每个###后面的行数是有规律的,所以才用split,
当然,别的方法当然会更好!
ps:你希望用什么方法?
发表于 2004-3-24 19:33:37 | 显示全部楼层
比较麻烦的方法 ;)
  1. 1]:
  2. /home/javalee:cat test.txt|sed 's/^#/\
  3. =>#/g' >t.txt
  4. /home/javalee:cat t.txt
  5. ###-1000
  6. 1000,001,99,001
  7. 1000,001,99,001
  8. 1000,001,99,001
  9. 1000,001,99,001
  10. ###-2000
  11. 2000,001,99,001
  12. 2000,001,99,001
  13. 2000,001,99,001
  14. 2000,001,99,001
  15. 2]:
  16. /home/javalee:name=$(cat test.txt|grep ^#|grep -o '[0-9]\{1,\}')
  17. /home/javalee:echo $name
  18. 1000 2000
  19. 3]:
  20. /home/javalee:for i in $name;do
  21. =>cat t.txt|sed -n "/^[#]\+[-]${i}/,/^$/p"|sed -n '2,$p'>>$i.txt;done
  22. /home/javalee:cat 1000.txt
  23. 1000,001,99,001
  24. 1000,001,99,001
  25. 1000,001,99,001
  26. 1000,001,99,001
  27. /home/javalee:cat 2000.txt
  28. 2000,001,99,001
  29. 2000,001,99,001
  30. 2000,001,99,001
  31. 2000,001,99,001
  32. /home/javalee:ls [0-9]*.txt
  33. 1000.txt  2000.txt
  34. /home/javalee:rm t.txt
复制代码
ps:我的PS2是:=>
发表于 2004-3-24 19:46:32 | 显示全部楼层
用csplit分割文件:
csplit -z filename '/###-/' {*}
输出的文件是从xx00开始,再用把它改名:
for f in `ls ./xx*`; do echo mv $f `cat $f | sed -n '1s/....//p'`.txt; done
就行了
发表于 2004-3-24 19:47:32 | 显示全部楼层
sorry,最后一条命令中不要有 echo:
for f in `ls ./xx*`; do mv $f `cat $f | sed -n '1s/....//p'`.txt; done
发表于 2004-3-24 19:50:36 | 显示全部楼层
最初由 idkey 发表
用csplit分割文件:
csplit -z filename '/###-/' {*}
输出的文件是从xx00开始,再用把它改名:
for f in `ls ./xx*`; do echo mv $f `cat $f | sed -n '1s/....//p'`.txt; done
就行了

我靠~~~,原来有这么好的命令呀~~~
我就知道有个split,唉,,佩服idkey兄~ :thank
发表于 2004-4-11 10:21:43 | 显示全部楼层
Gawk的实现
其实"提取文件内容"进行重定向是gawk的强项。csplit能分割文件,但本身不能改名,需要额外的shell代码来补足这一点;相比之下,gawk能动态生成文件。

  1. #!/bin/gawk
  2. #--Text_filter--
  3. #--Written by home_king<home_king@163.com>--
  4. BEGIN{
  5.         FS="-"
  6. }
  7. {
  8.         if($0 ~ /^#/ && $2 ~ /^[0-9]+$/){
  9.                 filename=$2".txt"
  10.                 next
  11.         }
  12.         if(filename){
  13.                 print $0 > filename
  14.         }
  15. }
复制代码

运行情况:

  1. [root@home root]# cat sadan
  2. ###-1000
  3. 1000,001,99,001
  4. 1000,001,99,001
  5. 1000,001,99,001
  6. 1000,001,99,001
  7. ###-2000
  8. 2000,001,99,001
  9. 2000,001,99,001
  10. 2000,001,99,001
  11. 2000,001,99,001
  12. [root@home root]# gawk -f myawk5 sadan
  13. [root@home root]# cat 1000.txt
  14. 1000,001,99,001
  15. 1000,001,99,001
  16. 1000,001,99,001
  17. 1000,001,99,001
  18. [root@home root]# cat 2000.txt
  19. 2000,001,99,001
  20. 2000,001,99,001
  21. 2000,001,99,001
  22. 2000,001,99,001
复制代码

awk是处理复杂问题较好的工具,而且它的脚本可读性很好。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表