awk 中的数字解析

Mar*_*ter 7 awk

我有一个文本文件,第二列中有数字,数字有千位分隔符和十进制分隔符:

2014-01     2,277.40
2014-02     2,282.20
2014-03     3,047.90
2014-04     4,127.60
2014-05     5,117.60    
Run Code Online (Sandbox Code Playgroud)

我需要对数字求和,但以下awk语法不起作用:

awk '{X=X+$2} END {print X}' file
Run Code Online (Sandbox Code Playgroud)

它返回16,这显然是错误的。我怎么能告诉awk读取数字作为2277.40而不是2,277.40

n.s*_*.st 12

只需从您正在解析的字段中删除逗号:

awk '{sub(",", "", $2); X+=$2} END {print X}' file
Run Code Online (Sandbox Code Playgroud)

这开始是一个快速而肮脏的解决方案,但似乎实际上没有其他方法。从AWK 手册

通过将字符串的数字前缀解释为数字,将字符串转换为数字:“2.5”转换为 2.5,“1e3”转换为 1000,“25fix”的数值为 25。 无法解释的字符串因为有效数字被转换为零。

虽然可以通过CONVFMT变量设置数字到字符串转换的格式,但字符串到数字的转换没有这样的选项。[1]


Evengawk的 strtonum()在遵守系统语言环境定义的小数分隔符的同时,忽略(即切断)千位分隔符。


小智 11

请注意,虽然您需要在将值添加到总数之前从输入中删除逗号,但awk很高兴打印带有或不带有千位分隔符的结果。举个例子,如果你使用下面的代码:看看fmt代码中定义的变量。

您的输入:

$ cat file
2014-01     2,277.40
2014-02     2,282.20
2014-03     3,047.90
2014-04     4,127.60
2014-05     5,117.60    
Run Code Online (Sandbox Code Playgroud)

awk 代码:

$ awk '{gsub(/,/,"",$2);sum+=$2}END{printf(fmt,sum)}' fmt="%'6.3f\n" file
Run Code Online (Sandbox Code Playgroud)

结果:

16,852.700
Run Code Online (Sandbox Code Playgroud)

如果你想尝试这个上Solaris/SunOS系统,改变awk这个脚本的开始/usr/xpg4/bin/awk/usr/xpg6/bin/awknawk

希望这将是有用的。