添加并计算百分比

添加并计算百分比

我有两列数据,我想添加A列中的重复记录数,然后计算B列中的计数数,然后计算计数百分比。例子:

494   1
494
494
494   1
500
500   1
500
501
501
501  1
501

对于 494,有 4 个记录和 2 个计数,因此我想计算 2/4 = 0.50 等等。

答案1

作为一个简单的例子,这个awk例子相当复杂。

{
  if (A!=$1) {   # This section has a different A-column
    if (a) {       # If a>0, then it is not the beginning
      print A,b/a  # Print result
    }
    A=$1;          # Re-init variables
    a=0;
    b=0
  }
  ++a;
  b += $2 ? 1 : 0
}

要运行它,请将 awk 脚本frac-calc和数字放入number并运行它:

( cat number; echo ) | awk -E frac-calc

输出将是:

494 0.5
500 0.333333
501 0.25

之所以echo需要它,是因为它确保打印最后一个块(501)的结果,因为 A 列不同。

它也可以是一长串:

( cat number; echo ) | awk '{if(A!=$1){if(a){print A,b/a}A=$1;a=0;b=0}++a;b+=$2?1:0}'

编辑:使用END和不使用echo评论中提到的:

{
  if (A!=$1) {   # This section has a different A-column
    if (a) {       # If a>0, then it is not the beginning
      print A,b/a  # Print result
    }
    A=$1;          # Re-init variables
    a=0;
    b=0
  }
  ++a;
  b += $2 ? 1 : 0
}
END {
      print A,b/a  # Print result
}

并称其为:

awk -E frac-calc number

然后,单衬会长一点:

awk '{if(A!=$1){if(a){print A,b/a}A=$1;a=0;b=0}++a;b+=$2?1:0}END{print A,b/a}' number

答案2

第一个版本 - 使用二维数组。

gawk '
BEGIN {
    PROCINFO["sorted_in"] = "@ind_num_asc";
}
{
    arr[$1][0]++;
    arr[$1][1] += $2;
}
END {
    for(i in arr) {
        print i, arr[i][1] / arr[i][0];
    }
}' input.txt

PROCINFO["sorted_in"] = "@ind_num_asc";行的解释如下 -使用预定义的数组扫描顺序

gawk在这种情况下,可以通过将输出管道传输到命令来替换它sort -n

gawk '
{
    arr[$1][0]++;
    arr[$1][1] += $2;
}
END {
    for(i in arr) {
        print i, arr[i][1] / arr[i][0];
    }
}' input.txt | sort -n

第二个版本 - 更优化的变体,没有数组。

gawk '
NR == 1 { 
    record = $1;
}
record != $1 {
    print record, tallies / cnt;    
    record = $1;
    cnt = 0;
    tallies = 0;
}
{
    cnt++;
    tallies += $2;
}
END {
    print record, tallies / cnt;    
}' input.txt

输出:

494 0.5
500 0.333333
501 0.25

相关内容