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

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
123下一頁(yè)
最近訪問板塊 發(fā)新帖
查看: 8433 | 回復(fù): 22
打印 上一主題 下一主題

請(qǐng)教perl高手 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2014-06-16 21:42 |只看該作者 |倒序?yàn)g覽
請(qǐng)教perl高手一個(gè)較為復(fù)雜的列合并

總體目標(biāo):合并file1.txt file1.rar (232 Bytes, 下載次數(shù): 160) 和file2.txt file2.rar (235 Bytes, 下載次數(shù): 45) ,形成file_out.txt file_out.rar (316 Bytes, 下載次數(shù): 197)

具體要求:
按文件file1.txt和file2.txt中的1-4列為合并參考值:
如果文件file1.txt和file2.txt中某行1-4列完全相同,則直接合并該行的所有列,如第2,3,5,10,13行。
如果某個(gè)1-4列內(nèi)容存在于文件file1.txt,而不存在于文件file2.txt,則在文件file2.txt中用“0”補(bǔ)齊,合并該行的所有列,如第7,8行。
如果某個(gè)1-4列內(nèi)容存在于文件file2.txt,而不存在于文件file1.txt,則在文件file1.txt中用“0”補(bǔ)齊,合并該行的所有列,如第4,6,9,11,12行。

說(shuō)明:
1)第一行為標(biāo)題行
2)file1.txt和file2.txt文件中有缺值(空白)

圖示文件:
file1

file2

file_out


非常感謝!

論壇徽章:
8
技術(shù)圖書徽章
日期:2013-08-22 11:21:28未羊
日期:2015-01-19 22:22:25巳蛇
日期:2014-08-11 16:53:08子鼠
日期:2014-05-29 09:04:44摩羯座
日期:2014-04-11 14:15:07丑牛
日期:2014-01-24 12:41:28金牛座
日期:2013-11-21 17:38:28射手座
日期:2015-01-21 08:50:32
2 [報(bào)告]
發(fā)表于 2014-06-16 23:49 |只看該作者
本帖最后由 huang6894 于 2014-06-17 10:50 編輯

求并集?
建議樓主搜一搜吧,挺簡(jiǎn)單的。。。


占樓~

24k菜鳥的方法{:3_195:} 弄了四個(gè)hash去做,不好意思了~:
  1. my (%hash,%h1,%h2,%h2_1);

  2. $file1 =  $ARGV[0];
  3. $file2 =  $ARGV[1];

  4. while (<>) {
  5.         chomp;
  6.         my @h = split(/\t/);
  7.         my ($k1,$k2,$k3,$k4,@v) = @h[0,1,2,3,4 .. $#h];
  8.         map{$hash{"$k1\t$k2\t$k3\t$k4"} .= "$_\t"}@v;
  9. }
  10. my @merge = keys (%hash);
  11. open F1, "< $file1" or die "$!";
  12. open F2, "< $file2" or die "$!";
  13. while(<F1>){
  14.         chomp;
  15.         my @h = split(/\t/);
  16.         my ($k1,$k2,$k3,$k4) = @h[0,1,2,3];
  17.         my $t = "0\t" x ($#h-3);
  18.         $t =~  s/\t$//;
  19.         $h1{"$k1\t$k2\t$k3\t$k4"} = 1;
  20.         $h2_1{"not_exit_file1"} = $t;
  21. }
  22. close F1;
  23. while(<F2>){
  24.         chomp;
  25.         my @h = split(/\t/);
  26.         my ($k1,$k2,$k3,$k4) = @h[0,1,2,3];
  27.         my $t = "0\t" x ($#h-3);
  28.         $t =~  s/\t$//;
  29.         $h2{"$k1\t$k2\t$k3\t$k4"} = 1;
  30.         $h2_1{"not_exit_file2"} = $t;
  31. }
  32. close F2;
  33. my @f1 = keys (%h1);
  34. my @f2 = keys (%h2);
  35. for $i (grep {!$h1{$_}} @merge){
  36.         print "$i\t$hash{$i}$h2_1{not_exit_file1}\n";
  37. }
  38. for $i (grep {!$h2{$_}} @merge){
  39.         chop $hash{$i};
  40.         print "$i\t$h2_1{not_exit_file2}\t$hash{$i}\n";
  41. }
  42. for $i (grep {$h1{$_}} @f2){
  43.         chop $hash{$i};
  44.         print "$i\t$hash{$i}\n";
  45. }
復(fù)制代碼

論壇徽章:
6
丑牛
日期:2014-03-21 15:42:04子鼠
日期:2014-04-12 11:50:17處女座
日期:2014-09-01 09:25:1115-16賽季CBA聯(lián)賽之吉林
日期:2015-12-22 14:01:5215-16賽季CBA聯(lián)賽之廣東
日期:2016-03-08 18:49:422016科比退役紀(jì)念章
日期:2016-07-06 12:19:55
3 [報(bào)告]
發(fā)表于 2014-06-17 00:15 |只看該作者
本帖最后由 stanley_tam 于 2014-06-17 00:20 編輯

偶試試,貌似把所有空的都弄成0了。不知道行不行。。。{:3_193:}
  1. #!perl
  2. use Modern::Perl;

  3. sub _get_fh;

  4. my $data_in_txt_href = +{};
  5. my @headers = ();

  6. # get the data
  7. for my $file ('file1.txt', 'file2.txt'){
  8.     my $fh = _get_fh({file => $file, mode => '<'});

  9.     my $header = readline $fh;
  10.     chomp $header;
  11.     my @header_parts = split /\t/, $header;

  12.     push @headers, @header_parts[4 .. $#header_parts];

  13.     while (my $line = readline $fh) {
  14.         chomp $line;
  15.         my @parts     = split /\t/, $line;
  16.         my $first4col = join "\t", @parts[0 .. 3];

  17.         for my $item (4 .. $#header_parts){
  18.             $data_in_txt_href->{$first4col}->{ $header_parts[$item] } = $parts[$item] || 0;
  19.         }
  20.     }
  21.     close $fh;
  22. }

  23. # output the data
  24. my $out_fh = _get_fh({file => 'file_out.txt', mode => '>'});
  25. say {$out_fh} join "\t", ('chrom', 'start', 'end', 'strand', @headers);

  26. for my $first4col ( sort keys %{$data_in_txt_href} ){
  27.     my $out_line = $first4col;

  28.     for my $head_item (@headers){
  29.         my $item_value = $data_in_txt_href->{$first4col}->{$head_item} || 0;
  30.         $out_line .= "\t$item_value";
  31.     }

  32.     say {$out_fh} $out_line;
  33. }

  34. close $out_fh;
  35. say "Done, cost @{[time - $^T]} seconds, press <ENTER> to exit.";
  36. <STDIN>;


  37. sub _get_fh {
  38.     my $param = shift;
  39.     my $file = $param->{file};
  40.     my $mode = $param->{mode};
  41.     open my $fh, $mode, $file or
  42.         die "Fail to open file $file:$!\n";
  43.     return $fh;
  44. }

  45. __END__
復(fù)制代碼

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2014-06-17 07:36 |只看該作者
回復(fù) 3# stanley_tam

謝謝stanley兄弟,能實(shí)現(xiàn)。Modern Perl !   

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2014-06-17 12:17 |只看該作者
回復(fù) 2# huang6894
非常感謝兄弟!我去測(cè)試下。

stanley兄的代碼如果file2.txt中的header名稱與file1.txt的header名稱有重復(fù)的話會(huì)有點(diǎn)問題。




   

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2014-06-17 12:30 |只看該作者
回復(fù) 2# huang6894

謝謝黃兄,經(jīng)測(cè)試發(fā)現(xiàn)代碼處理標(biāo)題行有點(diǎn)問題,標(biāo)題行會(huì)移到文件中去,另外,沒有匹配1-4列時(shí),插入0的位置不對(duì)。呵呵,多謝多謝!
   

論壇徽章:
8
技術(shù)圖書徽章
日期:2013-08-22 11:21:28未羊
日期:2015-01-19 22:22:25巳蛇
日期:2014-08-11 16:53:08子鼠
日期:2014-05-29 09:04:44摩羯座
日期:2014-04-11 14:15:07丑牛
日期:2014-01-24 12:41:28金牛座
日期:2013-11-21 17:38:28射手座
日期:2015-01-21 08:50:32
7 [報(bào)告]
發(fā)表于 2014-06-17 12:37 |只看該作者
回復(fù) 6# owwa


    well~這只是一個(gè)思路,關(guān)于標(biāo)題行。。你把44-47行和37-39行換個(gè)位置就好了

論壇徽章:
0
8 [報(bào)告]
發(fā)表于 2014-06-17 12:49 |只看該作者
回復(fù) 7# huang6894

多謝多謝,換行后還是沒在header的位置,一時(shí)沒看明白。
   

論壇徽章:
8
技術(shù)圖書徽章
日期:2013-08-22 11:21:28未羊
日期:2015-01-19 22:22:25巳蛇
日期:2014-08-11 16:53:08子鼠
日期:2014-05-29 09:04:44摩羯座
日期:2014-04-11 14:15:07丑牛
日期:2014-01-24 12:41:28金牛座
日期:2013-11-21 17:38:28射手座
日期:2015-01-21 08:50:32
9 [報(bào)告]
發(fā)表于 2014-06-17 12:59 |只看該作者
本帖最后由 huang6894 于 2014-06-17 12:59 編輯

回復(fù) 8# owwa

  1. ===》 perl map5.pl file1.txt file2.txt
  2. chrom   chromstart      chromend        strand  a1      a2      b1      b2      c1      c2      d1      d2      e1      e2      f1      f2      o1      o2  p1       p2      q1      q2
  3. chr1    363     364     -       0       10      0       7       0       8       0       3       0.1     10      0       27      0       21      0       11  08
  4. chr1    33      34      +       0       3       0       20      0       4               0       0.11    9               0       0       1       0       1   017
  5. chr1    231     232     +       0       3       0       21      0       4               0       0.11    9               0       0       1       0       2   020
  6. chr1    210     211     +       0       3       0       21      0       4               0       0.11    9               0       0       1       0       2   020
  7. chr1    13      14      +       0       3       0.06    18      0.33    3               0       0.11    9               0       0       1       0       2   0.05     19
  8. chr1    217     218     -       0       0       0       0       0       0       0       0       0       0       0       0               0       0       1   023
  9. chr1    211     212     -       0       0       0       0       0       0       0       0       0       0       0       0               0       0       1   0.09     23
  10. chr1    232     233     -       0       0       0       0       0       0       0       0       0       0       0       0               0       0       1   024
  11. chr1    34      35      -       0       0       0       0       0       0       0       0       0       0       0       0               0       0       1   024
  12. chr1    253     254     -       0       0       0       0       0       0       0       0       0       0       0       0               0       0       1   023
  13. chr1    216     217     +       0       3       0       21      0       4               0       0.11    9               0       0       0       0       0   00
  14. chr1    212     213     +       0       3       0       21      0       4               0       0.11    9               0       0       0       0       0   00

  15. ===》cat map5.pl
  16. #########################################################################
  17. #! /usr/bin/perl -w
  18. # File Name: map5.pl
  19. # Created Time: 2014年06月17日 星期二 10時(shí)46分35秒
  20. ##    ┏┓        ┏┓
  21. ##    ┏┛┻━━━━━━━━━┛┻┓
  22. ##    ┃          ┃
  23. ##    ┃    ━   ┃
  24. ##    ┃  ┳┛  ┗┳   ┃
  25. ##    ┃       ┃
  26. ##    ┃ **  ┻  ** ┃
  27. ##    ┃       ┃
  28. ##    ┗━┓       ┏━┛
  29. ##    ┃      ┃
  30. ##     ┃      ┃
  31. ##    ┃      ┗━━━┓
  32. ##    ┃       ┣┓
  33. ##     ┃       ┏┛
  34. ##     ┗┓┓┏━━━━━━━┳┓┏┛
  35. ##     ┃┫┫      ┃┫┫
  36. ##     ┗┻┛      ┗┻┛
  37. ## ━━━━━━神獸保佑,代碼無(wú)bug━━━━━━
  38. ## Code is far away from bug with the animal protecting.
  39. #########################################################################
  40. my (%hash,%h1,%h2,%h2_1);

  41. $file1 =  $ARGV[0];
  42. $file2 =  $ARGV[1];

  43. while (<>) {
  44.         chomp;
  45.         my @h = split(/\t/);
  46.         my ($k1,$k2,$k3,$k4,@v) = @h[0,1,2,3,4 .. $#h];
  47.         map{$hash{"$k1\t$k2\t$k3\t$k4"} .= "$_\t"}@v;
  48. #       print "$k1\t$k2\t$k3\t$k4\t".$hash{"$k1\t$k2\t$k3\t$k4"}."\n";
  49. }
  50. my @merge = keys (%hash);
  51. open F1, "< $file1" or die "$!";
  52. open F2, "< $file2" or die "$!";
  53. while(<F1>){
  54.         chomp;
  55.         my @h = split(/\t/);
  56.         my ($k1,$k2,$k3,$k4) = @h[0,1,2,3];
  57.         my $t = "0\t" x ($#h-3);
  58.         $t =~  s/\t$//;
  59.         $h1{"$k1\t$k2\t$k3\t$k4"} = 1;
  60.         $h2_1{"not_exit_file1"} = $t;
  61. }
  62. close F1;
  63. while(<F2>){
  64.         chomp;
  65.         my @h = split(/\t/);
  66.         my ($k1,$k2,$k3,$k4) = @h[0,1,2,3];
  67.         my $t = "0\t" x ($#h-3);
  68.         $t =~  s/\t$//;
  69.         $h2{"$k1\t$k2\t$k3\t$k4"} = 1;
  70.         $h2_1{"not_exit_file2"} = $t;
  71. }
  72. close F2;
  73. my @f1 = keys (%h1);
  74. my @f2 = keys (%h2);
  75. for $i (grep {$h1{$_}} @f2){
  76.         chop $hash{$i};
  77.         print "$i\t$hash{$i}\n";
  78. }

  79. for $i (grep {!$h1{$_}} @merge){
  80.         chop $hash{$i};
  81.         print "$i\t$h2_1{not_exit_file1}\t$hash{$i}\n";
  82. }
  83. for $i (grep {!$h2{$_}} @merge){
  84.         chop $hash{$i};
  85.         print "$i\t$hash{$i}\t$h2_1{not_exit_file2}\n";
  86. }

復(fù)制代碼

論壇徽章:
0
10 [報(bào)告]
發(fā)表于 2014-06-17 13:15 |只看該作者
回復(fù) 9# huang6894

非常感謝黃兄!奇怪的是我這里標(biāo)題行總是在第二行。


   
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP