如何使用相同的模式perl拆分大文件并写入单个记录?
我有一个多GB的文件,由数千个基于ID的单独文件组成 每个组件文件由四个注释行组成,后跟内容。每一秒的注释行都有一个唯一的ID。我想将文件拆分为按ID命名的单个文件 还有第二个如何使用相同的模式perl拆分大文件并写入单个记录?,perl,split,pattern-matching,Perl,Split,Pattern Matching,我有一个多GB的文件,由数千个基于ID的单独文件组成 每个组件文件由四个注释行组成,后跟内容。每一秒的注释行都有一个唯一的ID。我想将文件拆分为按ID命名的单个文件 还有第二个大小列表,包含ID和大小。我想把这一行作为每个输出文件的第一行先写 例子 尺码表 A_1100 Bxx_xx 25 P_b 342 1A_Z0 343 Z867200 BWS 111 输入文件 #版本XX #查询:A_1 #数据库:XX #用法:XX A_1* A_1* A_1* A_1* A_1* #弗尔 #查询:Bx
大小列表
,包含ID和大小。我想把这一行作为每个输出文件的第一行先写
例子
尺码表
A_1100
Bxx_xx 25
P_b 342
1A_Z0 343
Z867200
BWS 111
输入文件
#版本XX
#查询:A_1
#数据库:XX
#用法:XX
A_1*
A_1*
A_1*
A_1*
A_1*
#弗尔
#查询:Bxx_xx
#数据库:XXXXXX
#用法:XXXXX
Bxx_xx*
Bxx_xx*
Bxx_xx*
Bxx_xx*
Bxx_xx*
Bxx_xx*
Bxx_xx*
Bxx_xx*
Bxx_xx*
Bxx_xx*
#弗尔
#查询:P_b
#数据库:XXXXXX
#用法:XXXXX
P_b*
P_b*
P_b*
P_b*
P_b*
P_b*
#弗尔
#查询:1A_Z0
#数据库:XXXXXX
#用法:XXXXX
1A_Z0*
1A_Z0*
1A_Z0*
1A_Z0*
#弗尔
#查询:Z867
#数据库:XXXXXX
#用法:XXXXX
#弗尔
#查询:BWS
#数据库:XXXXXX
#用法:XXXXX
BWS*
BWS*
BWS*
输出应如下所示(ID.txt)
A_1.txt
A_1100
#XX版
#查询:A_1
#数据库:XX
#用法:XX
A_1*
A_1*
A_1*
A_1*
A_1*
Bxx_xx.txt
Bxx_xx 25
#弗尔
#查询:Bxx_xx
#数据库:XXXXXX
#用法:XXXXX
Bxx_xx*
Bxx_xx*
Bxx_xx*
Bxx_xx*
Bxx_xx*
Bxx_xx*
Bxx_xx*
Bxx_xx*
Bxx_xx*
Bxx_xx*
P_b.txt
P_b 342
#弗尔
#查询:P_b
#数据库:XXXXXX
#用法:XXXXX
P_b*
P_b*
P_b*
P_b*
P_b*
P_b*
1A_Z0.txt
1A_Z0 343
#弗尔
#查询:1A_Z0
#数据库:XXXXXX
#用法:XXXXX
1A_Z0*
1A_Z0*
1A_Z0*
1A_Z0*
Z867.txt
z867200
#弗尔
#查询:Z867
#数据库:XXXXXX
#用法:XXXXX
BWS.txt
BWS 200
#弗尔
#查询:BWS
#数据库:XXXXXX
#用法:XXXXX
BWS*
BWS*
BWS*
在某些情况下,四行之后可能没有内容。例如
#版本
#查询:Z867
#数据库:XXXXXX
#用法:XXXXX
我仍然希望它们作为新文件,Z867.txt
我的代码如下
while($line=){
chomp$行;
$cpline=$line;
下一个if($cpline=~/^Query/);
如果($cpline=~/^\sQuery\:\s(\w.*)/){
$query=$1;
foreach$sizeLine(@sizeList){
$sizeLine=~/^(\w.*)\t(\d+)$/;
$seqId=$1;
$seqLen=$2;
如果($seqId eq$query){
打印“查询\t$seqLen\n”;
}
}
}
$cpline=“”;
如果($line=~/^#/){
打印“$line\n”;
}
如果($line!~/^#/){
如果($line=~/^((.+)\\\.+)\t((.+)\\.+)\t(+)\t++\t++\t++\t++\t++\t++\t++\t++\t++\t++\t?++$/){
$queryId=$1;
如果($seqId eq$queryId){
打印“$line\n”;
}
}
}
}
代码:
use strict;
use warnings 'all';
my $filename = "t1";#provide your input file name
open FH, $filename or die "Error\n";
my $prev_line;
while(my $line =<FH>)
{
chomp($line);
if($line =~ /#\sver/)
{
if($. != 1)
{
close(FH2);
}
$prev_line =$line;
}
elsif($line =~ /#\sQuery:(.*)/)
{
my $id =$1;
$id =~ s/\s//;
print "$id\n";
open FH2,">$id.txt" or die "Error";
print FH2 "$prev_line\n$line\n";
}
else
{
print FH2 "$line\n";
}
}
close(FH);
使用严格;
使用“全部”警告;
我的$filename=“t1”#提供您的输入文件名
打开FH、$filename或死“Error\n”;
我的$prev_行;
while(我的$line=)
{
chomp($line);
如果($line=~/\sver/)
{
如果($!=1)
{
关闭(FH2);
}
$prev_line=$line;
}
elsif($line=~/\sQuery:(.*)/)
{
my$id=$1;
$id=~s/\s/;
打印“$id\n”;
打开FH2,“>$id.txt”或“错误”;
打印FH2“$prev\u line\n$line\n”;
}
其他的
{
打印FH2“$line\n”;
}
}
关闭(FH);
希望这能对您有所帮助。我对您的问题感到困惑,因为您的Perl代码似乎做了一些与您的问题描述非常不同的事情。但是,这里有一个简单的解决方案,它可以为注释中的每一个
#查询:
行打开一个新文件,并生成所需的输出
此程序希望输入文件的路径作为命令行上的参数
使用严格;
使用“全部”警告;
使用自动模具;
我的$out\u fh;
我的@header;
而(){
如果(/^#/){
推送@标题,$\;
如果(/Query:\s*(\s+/){
my$file=“$1.txt”;
打印qq{正在创建“$file”\n};
打开$out_fh,'>',$file;
}
如果(@header==4){
打印$out_fh@标题;
@标题=();
}
}
elsif($out_fh){
打印$out\u fh$\u;
}
}
关闭$OFH;
输出
创建“A_1.txt”
创建“Bxx_xx.txt”
创建“P_b.txt”
创建“1A_Z0.txt”
创建“Z867.txt”
创建“BWS.txt”
更新 这是我的代码的新版本,它符合您修订的规范。(请不要这样做。)
使用严格;
使用“全部”警告;
使用自动模具;
@ARGV=qw/4l.txt size_list.txt/;
我的($input,$size_list)=@ARGV;
我的%尺寸;
{
打开我的$fh、、$文件;
打印$out\u fh“$id\t$size\n”;
}
如果(@header==4){
打印$out_fh@标题;
@标题=();
}
}
elsif($out_fh){
打印$out\u fh$\u;
}
}
如果$out\u fh,则关闭$out\u fh;
继续,试着自己解决问题,然后在遇到问题时询问问题。你说“我想把它们放在单独的文件中,然后是内容”,所以我编辑了你的问题以反映这一点。但您将其更改为在单个文件中显示所有输出。请问是哪一个?因为这是我第一次来这里,我不知道如何使用所有选项。我是perl和本论坛的初学者。有人能看一下我的代码并更正吗?谢谢。是的,我的编辑不知怎的失败了。但你是对的,博罗丁。我想把它们放到单独的文件中,然后是内容。你的代码似乎与你所问的问题没有什么关系。什么是@sizeList<