awk - 计算任意列数的百分比

标签 awk bsd

鉴于此示例输入:

ID     Sample1     Sample2      Sample3
One      10          0            5
Two      3           6            8
Three    3           4            7

我需要使用 AWK 生成此输出:

ID    Sample1 Sample2 Sample3
One   62.50   0.00    25.00
Two   18.75   60.00   40.00
Three 18.75   40.00   35.00

这就是我解决这个问题的方法:

function percent(value, total) {
    return sprintf("%.2f", 100 * value / total)
}
{
    label[NR] = $1
    for (i = 2; i <= NF; ++i) {
        sum[i] += col[i][NR] = $i
    }
}
END {
    title = label[1]
    for (i = 2; i <= length(col) + 1; ++i) {
        title = title "\t" col[i][1]
    }
    print title
    for (j = 2; j <= NR; ++j) {
        line = label[j]
        for (i = 2; i <= length(col) + 1; ++i) {
            line = line "\t" percent(col[i][j], sum[i])
        }
        print line
    }
}

这在 GNU AWK 中运行良好(Linux 中的 awk,BSD 中的 gawk), 但在 BSD AWK 中则不然,我收到此错误:

$ awk -f script.awk sample.txt
awk: syntax error at source line 7 source file script.awk
 context is
          sum[i] += >>>  col[i][ <<<
awk: illegal statement at source line 7 source file script.awk
awk: illegal statement at source line 7 source file script.awk

问题似乎出在多维数组上。 我想让这个脚本也能在 BSD AWK 中工作, 所以它更便携。

有没有办法改变它以使其在 BSD AWK 中工作?

最佳答案

尝试使用伪二维形式。而不是

col[i][NR]

使用

col[i,NR]

这是一个一维数组,关键是连接的字符串:i SUBSEP NR

关于awk - 计算任意列数的百分比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27623651/

相关文章:

linux - 在 linux 中识别列中的各个条目

bash - awk 如果第 n 列值乘以 X 大于 Y

python - 如何使用 python 永久启动 ssh-agent?

c - typedef int function(void*) 是什么意思?

linux - 删除模式之间的空行

linux - 如何通过 sed 或 awk 递归替换文件中的字符串?

awk - 用文件内容替换字符串

bind() 套接字可以连接到远程地址吗?

sockets - BSD 套接字的文件描述符错误

c - 真的不检查close()的返回值: how serious,吗?