Chinaunix

标题: 请教Perl哈希: [打印本页]

作者: Azar92    时间: 2016-04-03 11:28
标题: 请教Perl哈希:
请问是否可以使用哈希将以下数据中A、B物质(substance)的三个浓度(concentration)分别加起来?
substance              concentration
A                           12
A                           11
A                           15
B                           23
B                           21
B                           26
初学Perl,请求大神赐教代码
作者: sunzhiguolu    时间: 2016-04-03 11:49
回复 1# Azar92
  1. perl -alne '{$h{$F[0]}+=$F[-1]}END{print "$_ => $h{$_}" for keys %h}' ur.txt
复制代码

作者: Azar92    时间: 2016-04-03 12:49
谢谢帮助指导 ,可我运行程序后在"}END"处报错啦
我输入的代码是(见识不够,还没看懂代码,是直接的copy):
    perl -alne {$h{$F[0]}+=$F[-1]}END{print "$_ => $h{$_}" for keys %h}
        __DATA__
substance              concentration
A                           12
A                           11
A                           15
B                           23
B                           21
B                           26
大神能否帮我再debug一下呀
回复 2# sunzhiguolu


   
作者: Azar92    时间: 2016-04-03 12:55
思考了一下,我需要先把我的数据放到数组F里么?回复 2# sunzhiguolu


   
作者: yakczh_cu    时间: 2016-04-03 12:58
awk "{ arr[$1]=arr[$1]+$2 } END { for( key in arr) { print key , arr[key] } } "  data.txt
作者: sunzhiguolu    时间: 2016-04-03 13:07
回复 3# Azar92
你的环境是?

   
作者: sunzhiguolu    时间: 2016-04-03 13:11
本帖最后由 sunzhiguolu 于 2016-04-03 13:12 编辑

回复 4# Azar92
用这个吧, 比较稳妥一点.
perl abc ur.txt

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

  4. my %hData;
  5. while (<>){
  6.         my ($sK, $sV) = split;
  7.         $hData{$sK} += $sV;
  8. }

  9. foreach (keys %hData){
  10.         print "$_ => $hData{$_}\n";
  11. }
复制代码

作者: sunzhiguolu    时间: 2016-04-03 13:16
回复 4# Azar92
看下这个, Jason680 大神提供的.
http://highdb.com/perl-one-line-command-%E4%BB%8B%E7%BB%8D/

   
作者: Azar92    时间: 2016-04-03 13:19
我是在Windows里运行的代码。我看得懂这个,谢谢大神,问题解决啦啦啦,谢谢谢谢
很想知道你给我的第一个代码是Unix里用的么  
回复 7# sunzhiguolu


   
作者: sunzhiguolu    时间: 2016-04-03 13:25
本帖最后由 sunzhiguolu 于 2016-04-03 13:28 编辑

回复 9# Azar92
Windows 下安装 Cygwin, 在 Windows 环境中用 perl one line command 有好多问题.
感兴趣的话, 看下 => http://www.cygwin.cn/
这个也是 Jason680 大神提醒的, 哈哈我也是受益者!
   
作者: Azar92    时间: 2016-04-03 13:34
好的好的,受教了,多谢指点,多谢代码
回复 10# sunzhiguolu


   
作者: Azar92    时间: 2016-04-03 13:40
好的好的,慢慢来学习Perl,非常感谢你的指导和代码,谢谢!
回复 10# sunzhiguolu


   
作者: Eva326    时间: 2016-10-02 21:43
  1. #!/usr/bin/perl -w
  2. use strict;

  3. open (IN, "<1.txt") or die $!;
  4. my %hash;
  5. while(<IN>){
  6.         chomp;
  7.         my ($ID, $value) = split;
  8.         next unless $value =~ /[0-9]/;
  9.         $hash{$ID} += $value;
  10. }
  11. foreach (keys %hash){
  12.         print "$_\t$hash{$_}\n";
  13. }
复制代码


  1. #!/usr/bin/perl -w
  2. use strict;

  3. open (IN, "<1.txt") or die $!;
  4. readline IN;
  5. my %hash;
  6. while(<IN>){
  7.         chomp;
  8.         my ($ID, $value) = split;
  9.         $hash{$ID} += $value;
  10. }
  11. foreach (keys %hash){
  12.        print "$_\t$hash{$_}\n";
  13. }
复制代码






欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2