LinuxSir.cn,穿越时空的Linuxsir!

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

怎么按照范围模式将一个大文本文件生成多个小文本文件?

[复制链接]
发表于 2010-9-13 08:55:01 | 显示全部楼层 |阅读模式
一个10M多的文本文件,其内容的结构如下:
...
pattern_1
   数据区1
   ...
pattern _2

pattern_1
   数据区2
   ...
pattern _2

pattern_1
   数据区3
   ...
pattern _2
...


怎样根据pattern_1和pattern_2 将其中的数据区内容提取到多个文件呢?
(一个数据区存成一个文件)
发表于 2010-9-13 21:16:39 | 显示全部楼层
可以用perl, 代码如下:
  1. #!/usr/bin/perl
  2. use warnings;
  3. $_=<>;
  4. chomp();
  5. if ($_ =~/^pattern_/) {
  6.         $i{$_}=1;
  7.         open (FH,">".$_."_".$i{$_}++);
  8. }else{
  9.         open (FH,">before_pattern");
  10. }
  11. print FH $_."\n";
  12. while(<>){
  13.         chomp();
  14.         if ($_ =~ /^pattern_/) {
  15.                 $i{$_} = 1 unless $i{$_};
  16.                 close(FH);
  17.                 open(FH,">".$_."_".$i{$_}++);
  18.         }
  19.         print FH $_."\n";
  20. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2010-9-14 20:32:03 | 显示全部楼层
如果那些内容是行数固定的或者大小固定的,就可以用split来。一句就搞定了。
回复 支持 反对

使用道具 举报

发表于 2010-9-15 20:41:05 | 显示全部楼层
awk '/pattern/{f=$0;next}{print >> f}'  数据文件

会生成以 pattern_1  pattern_2  这样的文件名
回复 支持 反对

使用道具 举报

发表于 2010-9-18 07:05:16 | 显示全部楼层
perl -ne 'if(/(parttern_\d+)/){open OUT,'>',$1}else{print OUT $_}'
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-9-25 23:18:01 | 显示全部楼层
谢谢几位热心的朋友,特别是lastart给出了详细的perl代码。

由于没接触过perl编程,但我还是尝试用脚本解决了这个碰到的实际问题,可能思路比较死板,不过能解决问题。

BASH代码如下,供大家参考:

grep -n 'pattern_1'  myfilename  |  sed 's/:/ /g'  |   awk '{print $1}'   > temp_file1

grep -n 'pattern_2'  myfilename  |  sed 's/:/ /g'  |   awk '{print $1}'   > temp_file2

paste  temp_file1  temp_file2  >  line_number_file

while  read n1 n2; do
sed -n "${n1}, ${n2}p" myfilename  >  "myfilename${n1}${n2}"
done <   line_number_file


主要思路如下:
1. grep 提取pattern_1和pattern_2行号,sed和awk处理后,形成2个临时文件;
2. paste 将2个文件对应的行连接, 方便read读入;
3. 循环从line_number_file文件读入行号,利用sed范围模式打印所需的部分到对应的新文件(新文件名比较乱,就是原文件名和2个行号组合成);

至此,OK了。(本来还打算用C写程序来做这个事情)
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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