我有一行代码想要使用,但我希望它循环遍历文件中的所有列,我可以在 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
你就在不远的地方。但是放入next
for 循环是一个错误,因为它将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
如果您需要任何澄清,请发表评论。