如何用awk将CSV文件中的科学计数法转换为整数?现有脚本无效
问题:Awk脚本无法将CSV中的科学计数法数值转换为整数
尝试用Awk将CSV文件中的科学计数法数值转换为原始整数,但执行脚本后输出仍保留科学计数法格式。
原Awk脚本
awk -F, '{ for (i=1;i<=NF;i++) if ($i+0 == $i && $i ~ /e/) $i = sprintf("%.0f", $i) } 1' f.csv
待处理的CSV文件(f.csv)内容
[Header],, .... .... ,, [Data],, ID,Number,Test 1,2.07E-11,a 2,2.07E-11,a
期望输出
[Header],, .... .... ,, [Data],, ID,Number,Test 1,207081000000,a 2,207081000000,a
问题分析与解决方案
原脚本的问题在于:
- 判断条件
$i+0 == $i依赖浮点数比较,存在精度偏差,可能无法正确识别部分科学计数法数值; - 针对
2.07E-11这类极小数值,sprintf("%.0f")会直接取整为0,而你期望的是转换为大数(推测是输入时笔误,实际应为2.07081E11这类正指数科学计数法)。
修改后的Awk脚本
awk -F, '{ for (i=1; i<=NF; i++) { # 精准匹配科学计数法格式(支持大小写e/E、正负指数) if ($i ~ /^[+-]?[0-9]*\.?[0-9]+[eE][+-]?[0-9]+$/) { # 格式化整数,保留所有有效数字 $i = sprintf("%.0f", $i) } } } 1' f.csv
如果确实需要处理负指数的科学计数法(如2.07E-11转换为带前导零的整数形式),可以使用以下脚本:
awk -F, '{ for (i=1; i<=NF; i++) { if ($i ~ /^([+-]?[0-9]*\.?[0-9]+)[eE]([+-]?[0-9]+)$/) { coeff = $1 + 0 exp = $2 + 0 if (exp >= 0) { # 正指数:放大后转为整数 $i = sprintf("%.*f", exp, coeff * (10^exp)) sub(/\.0$/, "", $i) } else { # 负指数:补前导零转为整数 $i = sprintf("%0*d", (-exp) + length(int(coeff * 10^(-exp))), int(coeff * 10^(-exp))) } } } } 1' f.csv
内容的提问来源于stack exchange,提问作者justaguy
相关产品推荐
相关产品推荐

