文件中金额的总和应作为单个值存储在 shell 变量中

文件中金额的总和应作为单个值存储在 shell 变量中
H|~^20200425|~^abcd|~^sum
R|~^abc|~^2019-03-06T12:33:52.27|~^1000123.34567|~^2018-04-12T12:33:52.27|
R|~^abc|~^2019-03-05T12:33:52.27|~^111930.02876|~^2018-10-23T12:33:52.27|
R|~^abc|~^2019-03-05T12:33:52.27|~^2112320.028|~^2018-10-24T12:33:52.27|
R|~^abc|~^2019-03-06T12:33:52.27|~^12230.0809|~^2018-09-11T12:33:52.27|
R|~^abc|~^2019-03-05T12:33:52.27|~^3076543789.00878|~^2018-08-05T12:33:52.27|
R|~^abc|~^2019-03-06T12:33:52.27|~^156655.0389|~^2018-10-23T12:33:52.27|
R|~^abc|~^2019-03-06T12:33:52.27|~^10453.0489|~^2018-04-08T12:33:52.27|
R|~^abc|~^2019-03-05T12:33:52.27|~^20654.0907|~^2018-07-23T12:33:52.27|

我需要获取从“R”开始的记录的第四个字段中的总金额之和。我希望将所有行的金额总和存储在变量中。如何实现

答案1

variable=$( awk -F '^' '$1 == "R|~" { sum += $4 } END { print sum }' file )

awk命令将数据视为^- 分隔,并对第一个字段中包含 的每一行中的第四个字段求和R,然后在读取所有数据后打印总和。|~在将字段数据转换为数值期间,字段末尾的非数字数据(字符串)将被忽略。

然后使用标准命令替换将命令的输出awk分配给变量。


对于非常大的数字,请使用bc

variable=$(
    awk -F '^' '$1 == "R|~" { sub("\\|.*","",$4); print $4 "+\\" } END { print "0" }' file  |
    bc
)

这将打印出总和作为要bc处理的计算。这bc实用程序是一个标准任意精度计算器。

相关内容