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

问题描述 投票:0回答:5

我有一个文本文件一些杂项数据和一些钱的费用。我想在特定行之间搜索所有美元数量并将它们相加。特定行意味着在第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可以搜索数字并对它们求和,但我无法弄清楚如何根据我的问题定制这些建议。

unix awk sed vi
5个回答
3
投票

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

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

0
投票

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

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

0
投票

一个非常通用的解决方案使用具有正向lookbehind的正则表达式:

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}'

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

0
投票

如果您的数据在'd'

 perl -ne 'BEGIN{$s=0} if($.>=6) {/\$([\d.]+)/; $s+=$1} END{print "total=$s"}' d
© www.soinside.com 2019 - 2024. All rights reserved.