我有一个文本文件,第二列中有数字,数字有千位分隔符和十进制分隔符:
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/awk
或nawk
。
希望这将是有用的。