在文本文件的特定行上搜索数量并求和

Search quantities on specific lines of text file and sum

我有一个文本文件,其中包含一些杂项数据和一些金钱支出。我想搜索特定行之间的所有美元数量并将它们相加。特定行表示在第 6 行和第 8 行之间搜索美元数量。

这是我的文本文件的示例:

Mary had a little .00 lamb
Bing bang bow

Blah blah blah

STARBUCKS Jan 8th, 2019 .00
MCDONALD'S Jan 10th, 2019 .00
UBER Jan 11th, 2019 .01

预期答案是 33.01 美元

我发现在 VI 中我可以像这样搜索美元数量:

/$\d\{2}\|$\d\{1}

我还在搜索结果中看到 AWK 可以搜索数字并对它们求和,但我不知道如何针对我的问题定制这些建议。

您可以使用 awk 进行一些模式匹配:

awk '$NF ~/^$.*$/{amt+=substr($NF,2)}END{print "$" amt}' file
.01

使用$作为字段分隔符。如果在第二列中有第二列(NF==2)求和值。

awk -F '$' 'NF==2{sum+=} END{print sum}' file

一个非常通用的解决方案使用正后视的正则表达式:

grep -oP --regexp='(?<=$)[0-9\.]*' inputFile | paste -s -d+ | bc

正则表达式 (?<=$)[0-9\.]* 仅匹配数字序列和“.”如果它们前面有“$”

使用 awk 的修改解决方案如下所示:

grep -oP --regexp='(?<=$)[0-9\.]*' inputFile | awk '{s+=} END {print s}'

两个命令return 33.01

要将总和限制在指定行,您可以在前面添加 awk 'NR>5 && NR<9{print [=14=]}':

awk 'NR>5 && NR<9{print [=12=]}' inputFile | grep -oP --regexp='(?<=$)[0-9\.]*' | awk '{s+=} END {print s}'

你可以试试 Perl

$ perl -ne ' /$(\S+)/ and $sum+= ; END { print $sum } ' quantile.txt
38.01

给定的输入是

$ cat quantile.txt
Mary had a little .00 lamb
Bing bang bow

Blah blah blah

STARBUCKS Jan 8th, 2019 .00
MCDONALD'S Jan 10th, 2019 .00
UBER Jan 11th, 2019 .01

如果你的数据在'd'

 perl -ne 'BEGIN{$s=0} if($.>=6) {/$([\d.]+)/; $s+=} END{print "total=$s"}' d