baiguihuajl 发表于 2015-09-24 09:35

[已解决]~~用perl将几个txt文件按照每个文件第一列相同名字合并,谢谢

本帖最后由 baiguihuajl 于 2015-09-29 13:51 编辑

如何用perl,按照每个文件第一列的名字将很多个txt文件合并,并且保留第一列存在相同名字的数值:
如将文件1.txt和2.txt和3.txt...合并
1.txt:
a        1
b        2
c        3
d        4
e        5
2.txt:
a        2
c        5
d        2
e        1
f        2
3.txt:
b        3
c        5
d        2
e        5
s        5
合并成:
c        3        5        5
d        4        2        2
e        5        1        5


b114213903 发表于 2015-09-24 10:01

试试用HASH

baiguihuajl 发表于 2015-09-24 14:43

能具体告诉我这么写代码吗?虽然知道哈希,但是不知道怎么用,而且将多个txt文件合并的循环也不会。。。谢谢哈~
回复 2# b114213903


   

MMMIX 发表于 2015-09-24 17:56

本帖最后由 MMMIX 于 2015-09-24 17:57 编辑

回复 3# baiguihuajl


    先别想 hash 或是循环什么的了。这个问题你倒是有思路没有呀?没有思路(逐步描述的伪代码),就先去想思路;想清楚,有思路了,直接把它翻译成 Perl 代码就完了。要是翻译过程中有什么问题,可以发贴问。

ba_du_co 发表于 2015-09-25 13:52

一个思路use 5.010;
my $c = 1 + @ARGV;
while (<>) {
    ( $a, $b ) = split;
    push @{ $_{$a} ||= [$a] }, $b;
}
$c - @$_ or say join "\t", @$_ for values %_;
perl join.pl 1.txt 2.txt 3.txt 4.txt 5.txt

baiguihuajl 发表于 2015-09-25 14:14

好的,谢谢~~~回复 4# MMMIX


   

baiguihuajl 发表于 2015-09-25 14:17

可以做出来,太感谢你了,我还要琢磨一下每句话什么意思~~~回复 5# ba_du_co


   

baiguihuajl 发表于 2015-09-25 14:46

for($i=1;$i<=4;$i++){
        open(DATA,"$i.txt");
        while(<DATA>){
                chomp;
                @line=split(/\t/,$_);
                if($i == 1){
                        $hash{$line}=$line;
                        $num{$line}=1;       
                }else{
                        if(exists $hash{$line}){
                                $hash{$line}.="\t".$line;
                                $num{$line}++;
                        }
                }
        }
        close(DATA);
}

foreach(keys %num){
        if($num{$_} == 4){
                print "$_\t$hash{$_}\n";
        }
}还有一个比较容易看懂的代码~~~

2013fish 发表于 2021-03-10 09:00

perl 非常好用,谢谢高手。
页: [1]
查看完整版本: [已解决]~~用perl将几个txt文件按照每个文件第一列相同名字合并,谢谢