水平组合多个文本文件

时间:2016-07-21 15:32:11

标签: linux perl

一个目录中有多个制表符分隔的文本文件,文件名中包含相同的字符串:“cnv_data.txt”我想水平组合这些文件。这是Perl脚本的一部分。每个文件中的行数和列数相同(11列和52行)。以下是所需输出的示例:

File0ne_cnv_data.txt
 SampleID: sample1
CHROM   POS        FUNC1.gene
chr1    11174372    MTOR


Filetwo_cnv_data.txt
 SampleID: sample2
CHROM   POS        FUNC1.gene
Chr2    1608066     MYCN



Combined_cnv_data.txt                       
SampleID: sample1                   SampleID: sample2       
CHROM   POS       FUNC1.gene        CHROM   POS       FUNC1.gene
chr1    11174372    MTOR            chr1    65310459    JAK1

我试过了:

my $cmd23 = `paste *final_cnv_data.txt >> $combined_CNV`; print $cmd23;

还有:

my $cmd23 = `cat *final_cnv_data.txt >> $combined_CNV`; print $cmd23;

但最终文件是空白的。

还有另一种方法可以实现我所寻找的目标吗?

由于

2 个答案:

答案 0 :(得分:3)

请尝试以下操作。

my @ar = <*.txt>; #This is called glob
my %hash;
foreach my $files(@ar)
{
    open my $fh, "<", $files or die "Error opening $!";;
    while (<$fh>)
    {
        chomp;
        $hash{"$."} .= "$_\t";

    }
}
foreach (sort{$a<=>$b}keys %hash)
{
    print "$hash{$_}\n";
}

使用glob将所有.txt文件存储在数组中。

然后,在perl $.特殊变量中给出文件中的当前行号。 只需创建哈希,键是行号,值是行的数据。

.=这意味着串联。因此,只需将下一个文件值附加到相同的行位置。

答案 1 :(得分:0)

检查粘贴命令

paste --help
paste $file1 file2 > $file3

或者,如果您想将所有文件与sufix组合,您可以

paste SUFIX* >> my_new_file.txt

修改

 #!/usr/bin/perl

 my $cmd23 = `paste /tmp/temp/fichero*`;

 print $cmd23;

PD:如果要打印,请不要重定向到文件