在文本文件的特定行上搜索数量并求和
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
我有一个文本文件,其中包含一些杂项数据和一些金钱支出。我想搜索特定行之间的所有美元数量并将它们相加。特定行表示在第 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