Perl实例---合并文件
Posted EasyPerl
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Perl实例---合并文件相关的知识,希望对你有一定的参考价值。
题目:我们有以下2个文件, 我们需要根据其b列来将数据进行合并
test.txt
a b c d
1 2 3 4
dd 3 as dgasfew
12 4 dfa reafda
123 5 df reafd
text2.txt
h f j b
1 2 3 4
dd 3 as 3
12 4 dfa 2
分析:我们需要针对b列来比较,从而合并2个文件中b列相同的数据, 这种情况下, 我们可以使用散列这个数据结构来完成我们的目标:
定义变量
my %hash;
my $head;
my $index1;
my $index2;
读取文件
open my $fh1, '<', 'test.txt' or die "failed to open test.txt\n";
open my $fh2, '<', 'test2.txt' or die "failed to open test2.txt\n";
将文件1的内容存入散列中, 其中key是b列的数据, value是整行数据
while(<$fh1>){
chomp;
提取表头
if ($. == 1){
$head = $_;
my @labels = split /\s+/, $_;
获取b列的位置
for my $label(@labels){
last if $label eq 'b';
$index1++;
}
next;
}
将数据存入散列中
my @vals = split /\s+/, $_;
my $key = $vals[$index1];
$hash{$key} = $_;
}
close $fh1;
对于test2的数据, 我们不需要再进行存储, 我们只需要读取一行直接处理一行, 因此在处理中, 我们往往选择小的那个文件存入散列中, 因为这样可以占用更小的内存
while(<$fh2>){
chomp;
if ($. == 1){
print "$head\t$_\n";
my @labels = split /\s+/, $_;
for my $label(@labels){
last if $label eq 'b';
$index2++;
}
next;
}
my @vals = split /\s+/, $_;
my $key = $vals[$index2];
如果b列的值同时存在于2个文件中, 则合并拼接此行文件
if($hash{$key}){
print "$hash{$key}\t$_\n";
}
}
close $fh2;
以上是关于Perl实例---合并文件的主要内容,如果未能解决你的问题,请参考以下文章