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

时间:2019-04-09 18:27:50

标签: unix awk sed vi

我有一个文本文件,其中包含一些其他数据和一些金钱费用。我想搜索特定行之间的所有美元数量并将其加总。特定行表示在第6行和第8行之间搜索美元数量。

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

Mary had a little $5.00 lamb
Bing bang bow

Blah blah blah

STARBUCKS Jan 8th, 2019 $7.00
MCDONALD'S Jan 10th, 2019 $6.00
UBER Jan 11th, 2019 $20.01

预期答案为$ 33.01

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

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

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

5 个答案:

答案 0 :(得分:3)

使用$作为字段分隔符。如果存在第二列(NF==2),则将第二列中的值相加。

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

答案 1 :(得分:0)

您可以将awk与某些模式匹配一​​起使用:

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

答案 2 :(得分:0)

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

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

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

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

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

两个命令都返回33.01

要将总和限制为指定的行,可以在awk 'NR>5 && NR<9{print $0}'之前加上

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

答案 3 :(得分:0)

您可以尝试Perl

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

给定的输入为

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

Blah blah blah

STARBUCKS Jan 8th, 2019 $7.00
MCDONALD'S Jan 10th, 2019 $6.00
UBER Jan 11th, 2019 $20.01

答案 4 :(得分:0)

如果您的数据位于“ d”

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