【问题标题】:merge multiple files with similar column合并具有相似列的多个文件
【发布时间】:2015-07-10 20:35:30
【问题描述】:

我有 30 个文件,其中每个文件的第 1 列相似。我想加入基于第 1 列的文件,以便输出文件包含来自每个输入文件的第 2 列。我知道如何加入两个文件,但处理多个文件时遇到了困难。

join -1 1 -2 1 File1 File2

文件以制表符分隔,没有这样的标题

文件1

5S_rRNA 1324
5_8S_rRNA   32
7SK 15
ACA59   0
ACA64   0
BC040587    0
CDKN2B-AS   0
CDKN2B-AS_2 0
CDKN2B-AS_3 0
CLRN1-AS1   0

文件2

5S_rRNA 571
5_8S_rRNA   11
7SK 5
ACA59   0
ACA64   0
BC040587    0
CDKN2B-AS   0
CDKN2B-AS_2 0
CDKN2B-AS_3 0
CLRN1-AS1   0

输出

5S_rRNA 1324 571
5_8S_rRNA   32 11
7SK 15 5
ACA59   0 0 
ACA64   0 0
BC040587    0 0
CDKN2B-AS   0 0
CDKN2B-AS_2 0 0
CDKN2B-AS_3 0 0
CLRN1-AS1   0 0

【问题讨论】:

  • 更好地发布您的代码并提供预期的输出。
  • 值的顺序重要吗?
  • 我有一个解决方案 - 但它确实需要一个标题行。您可能需要“伪造一个”才能使其正常工作。它查找常见的(命名的)标题,并基于它合并一个或多个 CSV 文件。 stackoverflow.com/a/31245514/2566198

标签: perl awk


【解决方案1】:

随着文件大小的增加,第一个内存是问题。其次,如果内容的顺序不重要,这会很好。

#!/usr/bin/perl
use strict;
use warnings;

my %hash;
my ($key,$value);
my @files=<files/*>;
foreach(@files){
open my $fh, '<', $_ or die "unable to open file: $! \n";
  while(<$fh>){
        chomp;
       ($key,$value)=split;
       push(@{$hash{$key}},$value);
    }
  close($fh);
}
for(keys %hash){
 print "$_ @{$hash{$_}} \n";
}

【讨论】:

    【解决方案2】:

    以下代码将提供您想要的输出,但当文件数量增加时(如您所说有 30 个文件),它将占用更多内存。通过使用sort,它按其键的字母顺序对哈希进行排序(将按照您在问题中提到的顺序给出输出)。

    #!/usr/bin/perl
    use strict;
    use warnings;
    
    my @files = qw| input.log input1.log |; #you can give here path of files, or use @ARGV if you wish to pass files from command line 
    my %data;
    
    foreach my $filename (@files)
    {
        open my $fh, '<', $filename or die "Cannot open $filename for reading: $!";
        while (my $line = <$fh>)
        {
            chomp $line;
            my ($col1, $col2) = split /\s+/, $line;
            push @{ $data{$col1} }, $col2; #create an hash of array
        }
    }
    foreach my $col1 (sort keys %data)
    {
        print join("\t", $col1, @{ $data{$col1} }), "\n";    
    }
    

    输出:

    5S_rRNA 1324    571
    5_8S_rRNA   32  11
    7SK 15  5
    ACA59   0   0
    ACA64   0   0
    BC040587    0   0
    CDKN2B-AS   0   0
    CDKN2B-AS_2 0   0
    CDKN2B-AS_3 0   0
    CLRN1-AS1   0   0
    

    【讨论】:

    • 你能补充一些解释吗?
    • 每一行都清晰。你能告诉我我需要为这个小代码添加什么解释吗?
    • 对我来说很清楚。但我认为如果你解释为什么这样做是有意义的,OP 可能会感激。 :)
    • @serenesat 不错的脚本。我想知道是否有可能将文件名作为输出中的标题?
    • @BioMan:你想在第一行打印所有文件名吗?
    猜你喜欢
    • 2021-09-24
    • 1970-01-01
    • 1970-01-01
    • 2020-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多