我有一个文本文件,其中包含一些其他数据和一些金钱费用。我想搜索特定行之间的所有美元数量并将其加总。特定行表示在第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可以搜索数字并求和,但是我不知道如何针对我的问题定制这些建议。
答案 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