2013-09-29 42 views
1

我被我的Perl代碼困住了。我想從一個名爲'file.txt'的公用文件中從不同目錄中合併一個名爲'value'的列。所有這些文件具有相同的行數。這些文件有多列,但我只想合併一列名爲「值」的列。我想要創建一個合併了所有'值'列的文件,但是該列的標題應該從它來自的目錄命名。合併來自不同目錄的公共文件的列,並重命名它來自的目錄的列標題?

指南-A
FILE.TXT

ID Value location 
1 50  9 
2 56  5 
3 26  5 

指南-B
FILE.TXT

ID Value location 
1 07  9 
2 05  2 
3 02  5 

指南-C
FILE.TXT

ID Value location 
1 21  9 
2 68  3 
3 42  5 

我的輸出應該是一個組合表如下:

ID Directory-A Directory-B Directory-C 
1 50    07   21 
2 56    06   68 
3 26    02   42 

我的Perl腳本從文件合併所有列而不是特定的列我感興趣的,我不知道如何重新命名的標題。 非常感謝您的建議。

+3

如果你想和你的腳本的幫助,請與大家共享。 – Kenosis

回答

0

只要你的文件是製表符分隔,你可以這樣做:

#!/usr/bin/perl 

use strict; 
use warnings; 
use autodie; 

my @result; 
my @files = ("directory-a/file.txt", "directory-b/file.txt", "directory-c/file.txt"); 

my $i = 0; 
foreach my $filename (@files) { 
    $result[ $i ] = []; 
    open(my $file, "<", $filename); 
    while (my $line = <$file>) { 
     my @columns = split(/\t/, $line); 
     push(@{ $result[ $i ] }, $columns[1]); # getting values only from the column we need 
    } 
    close $file; 
    $i++; 
} 

my $max_count = 0; 
foreach my $column (@result) { 
    $max_count = scalar(@$column) if (scalar(@$column) > $max_count); 
} 

open (my $file, ">", "result.txt"); 
for (0 .. $max_count - 1) { 
    my @row; 
    foreach my $col (@result) { 
     my $value = shift(@$col) || ""; 
     push(@row, $value);  
    } 
    print $file join("\t", @row), "\n"; 
}; 
close $file; 
相關問題