linux - 水平组合多个文本文件

标签 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;

但是最后的文件是空白的。

还有其他方法可以实现我的要求吗?

谢谢

最佳答案

尝试如下。

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 中 $. 特殊变量给出文​​件中的当前行号。 只需创建哈希,键是行号,值是行的数据。

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

关于linux - 水平组合多个文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38508416/

相关文章:

c++ - 在 Linux 上进行 3d 编程应该使用什么环境?

python - pip 安装 : issue with the ssl certificate

XML::Twig - 没有破坏结构的 set_text

perl - log4perl : How to write ERROR message to file and DEBUG message to stderr?

regex - 如何使用 REGEX perl 提取两个模式之间的文本

c - SSL_do_handshake() 卡住了

Linux 查找和替换(有条件)

perl - (m/regexp/)或{multiple;命令;后;要么; }

mysql - Perl 和 MYSQL。我可以用变量替换 now() 吗?

linux - 如何配置 logstash 以使用 "stdout"作为输入?