如何在bash中以科学记数法的形式对所有数字求和

  • 本文关键字:求和 数字 bash awk
  • 更新时间 :
  • 英文 :


我有一个类似的数据文件

1.59949146E+01  1.59949146E+01  1.59949146E+01  1.59949146E+01  1.59949146E+01
1.59949146E+01  1.59949146E+01  1.59949146E+01  1.59949146E+01  1.59949146E+01
1.59949146E+01  1.59949146E+01  2.39850450E+01  2.39850450E+01  2.39850450E+01
2.39850450E+01  2.39850450E+01  2.39850450E+01  2.39850450E+01  2.39850450E+01
2.39850450E+01  2.39850450E+01  2.39850450E+01  2.39850450E+01

为了求和所有的数字,我使用以下代码

awk '{ for(i=1;i<=NF;i++){ print $i}}' number.txt |awk '{printf ("%f ", $0)}' |awk '{ for(i=1;i<=NF;i++){ print $i}}'|paste -sd+  | bc

首先,它将所有raw更改为单列

awk '{ for(i=1;i<=NF;i++){ print $i}}' number.txt 
1.59949146E+01
1.59949146E+01
1.59949146E+01
1.59949146E+01
1.59949146E+01
1.59949146E+01
1.59949146E+01
1.59949146E+01
1.59949146E+01
1.59949146E+01
1.59949146E+01
1.59949146E+01
2.39850450E+01
2.39850450E+01
2.39850450E+01
2.39850450E+01
2.39850450E+01
2.39850450E+01
2.39850450E+01
2.39850450E+01
2.39850450E+01
2.39850450E+01
2.39850450E+01
2.39850450E+01

使用awk '{printf ("%f ", $0)}',我将具有以下输出

15.994915 15.994915 15.994915 15.994915 15.994915 15.994915 15.994915 15.994915 15.994915 15.994915 15.994915 15.994915 23.985045 23.985045 23.985045 23.985045 23.985045 23.985045 23.985045 23.985045 23.985045 23.985045 23.985045 23.985045

同样,我需要使用awk '{ for(i=1;i<=NF;i++){ print $i}}'将raws转换为列,然后使用paste -sd+ | bc我可以得到的答案

479.759520

虽然它有效,但我正在寻找一种更好的方法来减少步骤。

您可以将此单个awk用于:

awk '{for (i=1; i<=NF; ++i) sum += $i} END {print sum}' number.txt
479.76

或使用printf:

awk '{for (i=1; i<=NF; ++i) sum += $i} END {printf "%fn", sum}' number.txt
479.759515

如果您有gnu awk,则使用:

awk -v RS='[[:space:]]+' '{sum += $1} END {print sum}' number.txt

最新更新