【问题标题】:how to sum values for same ocurrence in a file? [closed]如何对文件中相同事件的值求和? [关闭]
【发布时间】:2019-01-21 01:03:03
【问题描述】:

我有下一个 csv 文件:

id;nucleotides
seq1;230
seq2;40
seq1;50
seq3;30

并且期望的结果是唯一的 id 和核苷酸的总和:

id;nucleotides
seq1;280
seq2;40
seq3;30

在 Perl 或 unix 中有什么快速的方法吗?

【问题讨论】:

  • 你尝试了什么?你有什么问题?
  • $counts{$row->{id}} += $row->{nucleotides};

标签: perl unix average


【解决方案1】:

你可以试试这个

#!/usr/bin/perl
use strict;
use warnings 'all';
use feature 'say';

my %count;

while (<DATA>) {
        chomp;
        next if $. == 1; # skip header
        my ($id, $nuc) = split(/;/, $_);
        $count{$id} += $nuc;
}

if (scalar (keys ( %count ) ) > 0) {
        say "id;nucleotides";
        foreach (sort keys %count) {
                say "$_;$count{$_}";
        }
}

__DATA__
id;nucleotides
seq1;230
seq2;40
seq1;50
seq3;30

【讨论】:

  • 您的if (! $hash{$id}) ... else ... 应该是$hash{$id} += $nuc。另外,(@Borodin 很快就会提到),%hash 不是一个好名字。
  • 提示:if (scalar (keys ( %count ) ) &gt; 0)可以写成if (%count)
  • 提示:第一个say 应该在if 之外(使if 无用)。
【解决方案2】:

awk:

awk -F';' 'NR==1;(NR>1){A[$1]+=$2} END{for(i in A)print i";"A[i]}' file

1) -F';' - ; char 作为分隔符

2) NR==1; - 打印第一行(标题)

3) (NR&gt;1){A[$1]+=$2} - 如果不是第一行,则将值与 $1 哈希 (a) 键相加

4) END{for(i in A)print i";"A[i] - 一旦完成所有文件行的总和,以“key;value”格式打印散列

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多