我有一个类似的数据文件
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