【发布时间】:2017-05-15 07:28:24
【问题描述】:
我有一个包含 150 列的大型 csv 文件,下面给出了一个示例::
id,c1,c2,c3,c4,c5...
1,0,acc,123.4E+03,0,bdd,...
2,1.299E-05,bef,1.666E-08,23,ghh....
如您所见,某些字段的值采用科学计数法(鉴于 csv 文件有超过 50 亿行,因此不知道所有列的值采用科学计数法)。
我需要将科学计数法中的值转换为对应的十进制形式。 我遇到了以下解决方案:Convert scientific notation to decimal in multiple fields 并获得以下代码:
#!/usr/bin/awk -f
BEGIN {
d = "[[:digit:]]"
OFS = FS = ","
}
{
delim = ""
for (i = 1; i <= NF; i++) {
if ($i ~ d "E+" d d d "$") {
printf "%s%.41f", delim, $i
}
else {
printf "%s%s", delim, $i
}
delim = OFS
}
printf "\n"
}
但是上面的脚本对我不起作用。上面的脚本按原样返回我的输入文件(对于 E+ 值和 E- 值),不进行任何转换。我对 shell 脚本还很陌生,有什么想法吗?
我正在以这种形式执行脚本:
chmod u+x awkscript.awk
./awkscript.awk inputfile.csv
【问题讨论】:
-
如果因为重复而被关闭,请至少将
CONVFMT解决方案复制到上面链接的帖子中。 -
csv 是从哪里来的? Excel xlsx,数据库?也许您可以更改单元格格式或导出选项,避免使用数字格式。您甚至可能赢得额外的精确度。