2016-04-29 70 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