在一个目录中有多个制表符分隔的文本文件,文件名中包含相同的字符串:“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/