我有两列数据,我想添加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