与第一个值相对应的行中每个值的百分比

时间:2015-04-27 19:02:18

标签: perl awk

我有一个大文件,其中包含以下格式的数据。

11      6       2       3
19      5       1       13
9       3       0       6
15      7       1       7
7       6       0       1
9       3       4       2

我想计算从第2列开始的每一行的值与第一列值的百分比。类似(6/11)*100; (2/11)*100; (3/11)*100的文件中的每一行。 预期产出

54.5  18.1 27.2
26.3  5.2  68.4
...
...

我试过awk,

awk '{a=($2/$1)*100; b=($3/$1)*100; c=($4/$1)*100}END{print a, b, c}'`

,结果为awk: cmd. line:1: (FILENAME=try FNR=27) fatal: division by zero attempted。这只是因为某些行中存在0或awk oneliner有什么问题吗?

2 个答案:

答案 0 :(得分:1)

从命令行使用perl,

perl -lane 'print join "\t", map $F[0] ? $_*100/$F[0] : "Nan", @F[1..$#F]' file

答案 1 :(得分:0)

是的,你有1美元左右的零。你需要这样的东西:

$ cat file
11      6       2       3
0       5       1       13
9       3       0       6
15      7       1       7
0       6       0       1
9       3       4       2

$ awk 'BEGIN{CONVFMT="%.1f"} {for (i=2;i<=NF;i++) $i=($1==0?"NaN":$i*100/$1)} 1' file
11 54.5 18.2 27.3
0 NaN NaN NaN
9 33.3 0 66.7
15 46.7 6.7 46.7
0 NaN NaN NaN
9 33.3 44.4 22.2

如果您不喜欢“NaN”,那么当$ 1为零时,将“NaN”替换为您想要显示的任何其他内容(您应该在样本输入中包含该情况)。

相关问题