我有一个大文件,其中包含以下格式的数据。
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有什么问题吗?
答案 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”替换为您想要显示的任何其他内容(您应该在样本输入中包含该情况)。