亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標(biāo)題: 已解決~用perl將幾個(gè)txt文件按照每個(gè)文件第一列相同名字合并,謝謝 [打印本頁(yè)]

作者: baiguihuajl    時(shí)間: 2015-09-29 11:24
標(biāo)題: 已解決~用perl將幾個(gè)txt文件按照每個(gè)文件第一列相同名字合并,謝謝
本帖最后由 baiguihuajl 于 2015-09-30 12:27 編輯

如何用perl,按照每個(gè)文件第一列的名字將很多個(gè)txt文件合并,并且每一項(xiàng)都保留,存在的就打印出來(lái),不存在的就用0表示
如:將1.txt 2.txt 3.txt 4.txt 四個(gè)文件合并:
1.txt:
a        1
b        2
c        2
d        4
e        1
f        3
g        1
s        2
h        1
2.txt:
a        1
c        1
d        2
e        3
f        1
g        2
h        2
i        2
j        1
3.txt:
b        1
c        2
d        1
e        2
f        2
g        2
h        1
4.txt:
a        2
b        1
c        2
d        3
e        4
f        5
g        1
h        3
合并以后變成這樣的效果(可以沒(méi)有順序輸出):
d        4        2        1        3
c        2        1        2        2
i        0        2        0        0
h        1        2        1        3
e        1        3        2        4
f        3        1        2        5
b        2        0        1        1
g        1        2        2        1
j        0        1        0        0
s        2        0        0        0
a        1        1        0        2


作者: baiguihuajl    時(shí)間: 2015-09-29 11:26
本帖最后由 baiguihuajl 于 2015-09-29 11:27 編輯

我的程序是:
  1. for($i=1;$i<=4;$i++){
  2.         open(F1,"$i.txt");
  3.         while(<F1>){
  4.                 chomp;
  5.                 @a=split(/\t/,$_);
  6.                 foreach($a[0]){
  7.                         next if exists $lines{$_};
  8.                         $lines{$_}=1;
  9.                 }
  10.         }
  11.         close(F1);
  12. }

  13. for($i=1;$i<=4;$i++){
  14.         open(F2,"$i.txt");
  15.         while(<F2>){
  16.                 chomp;
  17.                 @b=split(/\t/,$_);
  18.                 foreach($b[0]){
  19.                         if(exists $lines{$b[0]}){
  20.                                 $lines{$b[0]}.="\t".$b[1];
  21.                         }else{
  22.                                 $lines{$_}.="\t"."0";
  23.                         }
  24.                 }
  25.         }
  26.         close(F2);
  27. }


  28. open out,">>out.txt";
  29. foreach (keys %lines){
  30.         print out "$_\t$lines{$_}\n";
  31. }
復(fù)制代碼
結(jié)果是:
a        1        1        2
h        1        1        2        1        3
b        1        2        1        1
c        1        2        1        2        2
s        1        2
d        1        4        2        1        3
f        1        3        1        2        5
a        1        1        1        2
g        1        1        2        2        1
e        1        1        3        2        4
j        1        1
i        1        2

有誰(shuí)可以幫我改一下,謝謝~~~
作者: Okelani    時(shí)間: 2015-09-29 13:52
回復(fù) 1# baiguihuajl

#!/usr/bin/perl
@_ = qw[1.txt 2.txt 3.txt 4.txt];
for my $i ( 0 .. $#_ ) {
    @ARGV = $_[$i];
    while (<>) {
        ( $a, $b ) = split;
        $_{$a} ||= [ (0) x @_ ];
        $_{$a}[$i] = $b;
    }
}

while ( ( $a, $b ) = each %_ ) {
    print join( "\t", $a, @$b ), "\n";
}


   
作者: baiguihuajl    時(shí)間: 2015-09-29 13:58
能幫我改一下代碼嗎?而且如果我要合并很多的文件的話,應(yīng)該怎樣?謝謝~~~
回復(fù) 3# Okelani


   
作者: Okelani    時(shí)間: 2015-09-29 14:00
回復(fù) 4# baiguihuajl

@_ = qw[1.txt 2.txt 3.txt 4.txt 5.txt 6.txt 7.txt 8.txt];
   
作者: baiguihuajl    時(shí)間: 2015-09-29 14:04
1000個(gè)的話怎么寫(xiě)?==謝謝
回復(fù) 5# Okelani


   
作者: Okelani    時(shí)間: 2015-09-29 14:27
回復(fù) 6# baiguihuajl
  1.     @_ = map { $_ . '.txt' } 1 .. 1000;
復(fù)制代碼


my $looo = 1000;
for my $i ( 0 .. $looo - 1 ) {
    @ARGV = ( $i + 1 ) . '.txt';
    ...
    $_{$a} ||= [ (0) x $looo ];
    ....




10000個(gè)的話怎么寫(xiě)

my $loooo = 10000;
for my $i ( 0 .. $loooo - 1 ) {
...

作者: jason680    時(shí)間: 2015-09-29 15:53
本帖最后由 jason680 于 2015-09-29 20:43 編輯

回復(fù) 4# baiguihuajl

>> ...合并以后變成這樣的效果(可以沒(méi)有順序輸出):
>> ...合并很多的文件的話...

$ perl keys.pl *.txt
a        1        1        0        2
b        2        0        1        1
c        2        1        2        2
d        4        2        1        3
e        1        3        2        4
f        3        1        2        5
g        1        2        2        1
h        1        2        1        3
i        0        2        0        0
j        0        1        0        0
s        2        0        0        0

$ cat keys.pl
use strict;
use warnings;

my(%hKey, %hVal);

my @aFile = @ARGV;
while(<>){
  chomp;
  my($sKey, $sVal) = split;
  $hVal{$sKey}{$ARGV} = $sVal;
}

foreach my $sKey(sort keys %hVal){
  my $sVal = "";
  foreach(@aFile){
    $hVal{$sKey}{$_} = 0 if(!exists $hVal{$sKey}{$_});
    $sVal .= "\t$hVal{$sKey}{$_}";
  }
  print "$sKey$sVal\n";
}


   
作者: sunzhiguolu    時(shí)間: 2015-09-29 15:55
本帖最后由 sunzhiguolu 于 2015-09-29 15:57 編輯

回復(fù) 1# baiguihuajl
您好, 看了您的代碼. 發(fā)現(xiàn)您的問(wèn)題屬于代碼邏輯問(wèn)題:
問(wèn)題代碼范圍: 19~25 行位置.
for($i=1;$i<=4;$i++){
        open(F2,"$i.txt");
        while(<F2>){
                chomp;
                @b=split(/\t/,$_);
                foreach($b[0]){
                        if(exists $lines{$b[0]}){   #邏輯錯(cuò)誤的地方
                                $lines{$b[0]}.="\t".$b[1];
                        }else{
                                $lines{$_}.="\t"."0";
                        }
                }
        }
        close(F2);
}

紅色:可以刪除部分

  1. #添加的代碼:
  2. sub gen_hash_by_file{
  3.     my ($file, %h_file) = shift;
  4.     open (my $fh_file, '<', $file);
  5.     while (<$fh_file>){
  6.         chomp;
  7.         my ($id, $value) = split /\s+/;
  8.         $h_file{$id} = $value;
  9.     }
  10.     close ($fh_file);
  11.     %h_file;
  12. }
復(fù)制代碼

  1. #修改后的代碼: 14~28 行
  2. for (my $i = 1; $i <= 4; $i++ ){
  3.     my %h_file = gen_hash_by_file($i . '.txt');
  4.     foreach my $k (keys %lines){
  5.         if (exists $h_file{$k}){
  6.             $lines{$k} .= "\t" . $h_file{$k};
  7.         }else{
  8.             $lines{$k} .= "\t" . 0;
  9.         }
  10.     }
  11. }
復(fù)制代碼

作者: xie3ks    時(shí)間: 2015-09-29 17:05
  1. #!/usr/bin/perl

  2. use warnings;
  3. use strict;

  4. my %content;

  5. while(my $file_name = <*.txt>)
  6. {
  7.    open FILE_NAME, $file_name;
  8.    while(<FILE_NAME>)
  9.    {
  10.        my @line = split(/\s+/);
  11.        $content{$line[0]}{$file_name} = $line[1];
  12.    }
  13.    print " "x5,$file_name;
  14. }

  15. print "\n";

  16. foreach my $key_out(sort(keys %content))
  17. {
  18.     print "$key_out"," "x5;
  19.     while(my $file_name = <*.txt>)
  20.     {

  21.          if (defined $content{$key_out}{$file_name})
  22.          {
  23.              print $content{$key_out}{$file_name}," "x10;
  24.          }
  25.          else
  26.          {
  27.              print 0, " "x10;
  28.          }
  29.     }
  30.     print "\n";
  31. }
復(fù)制代碼
回復(fù) 1# baiguihuajl


   
作者: MMMIX    時(shí)間: 2015-09-29 20:26
怎么都是這么復(fù)雜的代碼……
作者: MMMIX    時(shí)間: 2015-09-29 20:27
回復(fù) 1# baiguihuajl


    #!/usr/bin/perl

use strict;
use warnings;

use v5.14;
use autodie;
use Data::Dumper;

my %record;
my @argv = @ARGV;

while (<>) {
  my ($id, $val) = split;
  $record{$id}->{$ARGV} = $val;
}

while (my ($id, $vals) = each %record) {
  say join "\t", ($id, map { $vals->{$_} // 0 } @argv);
}

作者: sunzhiguolu    時(shí)間: 2015-09-29 21:03
本帖最后由 sunzhiguolu 于 2015-09-29 21:13 編輯

回復(fù) 12# MMMIX
大神, 向您請(qǐng)教一下, 以下語(yǔ)句: (有兩處疑問(wèn))
$record{$id}->{$ARGV} = $val;

1.> $ARGV 與 @ARGV 參數(shù)數(shù)組之間什么關(guān)系? 方才我試了一下, 提示我使用沒(méi)有初始化的 $ARGV. 我的代碼如下:

  1. #!/usr/bin/perl
  2. use 5.010;
  3. use strict;
  4. usr warnings;

  5. say "\$ARGV$ARGV";
復(fù)制代碼
調(diào)用方式:
perl ./test a b c

2.> 在語(yǔ)句中您的哈希變量的使用方式怎么又變成這個(gè)樣子了?
   
$record{$id}->{$ARGV} = $val;
紅色代碼部分不是引用變量獲取指定鍵值的調(diào)用方式嗎?

您能否指點(diǎn)一下...

我也希望在回復(fù)帖子的時(shí)候盡量做到簡(jiǎn)短一些, 但是以我目前掌握的這點(diǎn)知識(shí)根本就沒(méi)有什么辦法. 在看您的回帖當(dāng)中, 代碼總是非常精煉. 所以總?cè)滩蛔∠蚰l(fā)問(wèn). 還請(qǐng)您給予幫助及支持...

   
作者: MMMIX    時(shí)間: 2015-09-29 21:17
回復(fù) 13# sunzhiguolu


    1. perldoc perlvar;然后查看 $ARGV 和 @ARGV 的介紹;
2. perldoc perlref;然后查看下 hash reference 的用法。
作者: sunzhiguolu    時(shí)間: 2015-09-29 21:21
本帖最后由 sunzhiguolu 于 2015-09-29 21:22 編輯

回復(fù) 14# MMMIX
好的, 我去查下用法.
另外, 如果我希望查找一些關(guān)于這方面的文章. 我應(yīng)該如何去設(shè)置我的檢索關(guān)鍵字? 還請(qǐng)您再次給予指點(diǎn)...

   
作者: MMMIX    時(shí)間: 2015-09-29 21:53
回復(fù) 15# sunzhiguolu


    把 perltoc 先瀏覽一遍,然后挑重要的逐個(gè)瀏覽一遍。
作者: sunzhiguolu    時(shí)間: 2015-09-29 21:56
回復(fù) 16# MMMIX
好吧, 啃英文. 謝謝您的幫助...

   
作者: baiguihuajl    時(shí)間: 2015-09-30 12:24
謝謝O(∩_∩)O~~
回復(fù) 12# MMMIX


   
作者: baiguihuajl    時(shí)間: 2015-09-30 12:25
謝謝~O(∩_∩)O~~
回復(fù) 8# jason680


   
作者: baiguihuajl    時(shí)間: 2015-09-30 12:26
謝謝~O(∩_∩)O~~
回復(fù) 9# sunzhiguolu


   
作者: baiguihuajl    時(shí)間: 2015-09-30 12:27
謝謝~O(∩_∩)O~~
回復(fù) 10# xie3ks


   




歡迎光臨 Chinaunix (http://72891.cn/) Powered by Discuz! X3.2