在 awk 中循环,计算其列中每个整数的百分比

在 awk 中循环,计算其列中每个整数的百分比

我有一行代码想要使用,但我希望它循环遍历文件中的所有列,我可以在 awk 之外执行此操作,但它真的很慢。我的问题是我不擅长在 awk 内循环,我可以运行一个简单的 awk 循环,但这需要一些我还不能做的事情。因此,如果您能解释一下如何解决这个问题,这将对我将来有所帮助。

此时 awk 命令将输出所选列 ($i) 中每个整数的等效百分比。这是当前的 awk 命令: awk -F ',' -v x=$i 'FNR==NR{s+=$x;next;} {printf "%s\n",100*$x/s}' File File

上述命令的输入示例:

1    
4    
3    
2    

上述命令的输出示例:

10.00000    
40.00000    
30.00000        
20.00000        

我需要在 awk 中循环文件中的所有列(文件列号未知)

因此,如果输入有多于一列,则示例输入可以是:

1,4,2    
4,4,1  
3,1,6    
2,1,1    

输出示例:

10.00000,40.00000,20.00000    
40.00000,40.00000,10.00000  
30.00000,10.00000,60.00000    
20.00000,10.00000,10.00000    

这是我所做的尝试(如下),显然它是错误的,我尝试为这两个部分运行循环,但根本没有给我任何输出。

awk -F"," 'NR==FNR { for (i=1;i<=NF;i++) {s+=$i;next;} next } { for (i=1;i<=NF;i++)printf "%s%%\n",100*$i/s }' File File

答案1

你就在不远的地方。但是放入nextfor 循环是一个错误,因为它将next在第一个字段上触发,进入下一行并忽略该行的其他字段。

awk -F ',' '
    NR==FNR{
        for(i=1;i<=NF;i++){s[i]=s[i]+$i}
        next
    }
    {
        for(i=1;i<NF;i++){printf "%f,",100*$i/s[i]}
        printf "%f\n",100*$NF/s[NF]
    }
' File File

s在你的尝试中是一个普通变量,但它应该是一个数组。因此它包含文件被解析一次后s[i]列的总和。i

请注意最后一个循环不NF包含在内,因为除了最后一个逗号之外的所有字段都应该被打印。在最后一个字段之后,应打印换行符。

输出:

10.000000,40.000000,20.000000
40.000000,40.000000,10.000000
30.000000,10.000000,60.000000
20.000000,10.000000,10.000000

如果您需要任何澄清,请发表评论。

相关内容