2016-04-29 67 views
1

请帮忙。Perl,提取特定列

我有两个文件(file1和file2)。我想从file2中提取ID列在file1中的列。这些都是大文件,有成千上万的列和行。

file1的

Id123B 
Id124A 
Id125A 

file2的

Code sex id123B id127 id125A 

期望的输出文件:

code sex id123B id125A 

以下是我已经尝试的代码,但它失败。

!/usr/bin/perl 
use strict; 
use warnings; 

open my $IN, "file2" or die $!; 

my $header = <$IN>; 

my %sampleID = map { /(.*?)\t/; $1 => 1 } <$IN>; 

close($IN); 

open $IN, "file1" or die $!; 
$header = <$IN>; 
my @samples = split /\t/, $header; 
my @cols = grep { exists $sampleID{$samples[$_]} } 0..$#samples; 


while(<$IN>){ 
    chomp; 
    my @line = (split /\t/)[@cols]; 

    print join("\t", @line), "\n"; 
} 

回答

0

使用散列将列名映射到列号。

#!/usr/bin/perl 
use warnings; 
use strict; 
use feature qw{ say }; 

open my $COLUMNS, '<', shift or die $!; 
chomp(my @columns = <$COLUMNS>); 

open my $DATA, '<', shift or die $!; 
my @header = split /\t/, <$DATA>; 
my %column_index; 
@column_index{ @header } = 0 .. $#header; 

@columns = grep exists $column_index{$_}, @columns; 

while (<$DATA>) { 
    chomp(my @cells = split /\t/); 
    say join "\t", @cells[ @column_index{ @columns } ]; 
} 

script.pl file1 file2运行。请注意,您必须在文件中使用精确的列名称,即使用以下文件1得到了更好的结果:

Code 
sex 
id123B 
id124A 
id125A 
+0

非常感谢您的帮助。我刚刚运行它,它不打印任何输出。数据格式也许? –

+0

@ El.h可能对我很有用。检查列名称。 – choroba