我有一个文本文件一些杂项数据和一些钱的费用。我想在特定行之间搜索所有美元数量并将它们相加。特定行意味着在第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可以搜索数字并对它们求和,但我无法弄清楚如何根据我的问题定制这些建议。
使用$
作为字段分隔符。如果第二列中有第二列(NF==2
)和值。
awk -F '$' 'NF==2{sum+=$2} END{print sum}' file
您可以使用awk
进行一些模式匹配:
awk '$NF ~/^\$.*$/{amt+=substr($NF,2)}END{print "$" amt}' file
$33.01
一个非常通用的解决方案使用具有正向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}'
你可以尝试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
如果您的数据在'd'
perl -ne 'BEGIN{$s=0} if($.>=6) {/\$([\d.]+)/; $s+=$1} END{print "total=$s"}' d