设为首页
收藏本站
用户名
Email
自动登录
找回密码
密码
登录
注册
快捷导航
平台
Portal
论坛
BBS
文库
项目
群组
Group
我的博客
Space
搜索
搜索
热搜:
shell
linux
mysql
本版
用户
LinuxSir.cn,穿越时空的Linuxsir!
»
论坛
›
Linux 综合讨论区 —— LinuxSir.cn
›
shell进阶应用、shell编程
›
怎么按照范围模式将一个大文本文件生成多个小文本文件? ...
返回列表
查看:
1231
|
回复:
5
怎么按照范围模式将一个大文本文件生成多个小文本文件?
[复制链接]
icefroster
icefroster
当前离线
积分
114
IP卡
狗仔卡
发表于 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 将其中的数据区内容提取到多个文件呢?
(一个数据区存成一个文件)
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
显身卡
lastart
lastart
当前离线
积分
913
IP卡
狗仔卡
发表于 2010-9-13 21:16:39
|
显示全部楼层
可以用perl, 代码如下:
#!/usr/bin/perl
use warnings;
$_=<>;
chomp();
if ($_ =~/^pattern_/) {
$i{$_}=1;
open (FH,">".$_."_".$i{$_}++);
}else{
open (FH,">before_pattern");
}
print FH $_."\n";
while(<>){
chomp();
if ($_ =~ /^pattern_/) {
$i{$_} = 1 unless $i{$_};
close(FH);
open(FH,">".$_."_".$i{$_}++);
}
print FH $_."\n";
}
复制代码
回复
支持
反对
使用道具
举报
显身卡
linwhwylb
linwhwylb
当前离线
积分
105
IP卡
狗仔卡
发表于 2010-9-14 20:32:03
|
显示全部楼层
如果那些内容是行数固定的或者大小固定的,就可以用split来。一句就搞定了。
回复
支持
反对
使用道具
举报
显身卡
springwind426
springwind426
当前离线
积分
1779
IP卡
狗仔卡
发表于 2010-9-15 20:41:05
|
显示全部楼层
awk '/pattern/{f=$0;next}{print >> f}' 数据文件
会生成以 pattern_1 pattern_2 这样的文件名
回复
支持
反对
使用道具
举报
显身卡
chenfengyuan
chenfengyuan
当前离线
积分
136
IP卡
狗仔卡
发表于 2010-9-18 07:05:16
|
显示全部楼层
perl -ne 'if(/(parttern_\d+)/){open OUT,'>',$1}else{print OUT $_}'
回复
支持
反对
使用道具
举报
显身卡
icefroster
icefroster
当前离线
积分
114
IP卡
狗仔卡
楼主
|
发表于 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写程序来做这个事情)
回复
支持
反对
使用道具
举报
显身卡
返回列表
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
注册
本版积分规则
发表回复
回帖后跳转到最后一页
Copyright © 2002-2023
LinuxSir.cn
(http://www.linuxsir.cn/) 版权所有 All Rights Reserved.
Powered by
RedflagLinux!
技术支持:
中科红旗
|
京ICP备19024520号
快速回复
返回顶部
返回列表