Поиск количества по конкретным строкам текстового файла и суммы - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть текстовый файл с некоторыми другими данными и с некоторыми денежными затратами. Я хочу найти все долларовые суммы между конкретными строками и суммировать их Определенные строки, означающие поиск долларовых величин между строками 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 ]

3 голосов
/ 09 апреля 2019

Используйте $ в качестве разделителя полей.Если во втором столбце есть значения суммы (NF==2) во втором столбце.

awk -F '$' 'NF==2{sum+=$2} END{print sum}' file
0 голосов
/ 13 апреля 2019

если ваши данные в 'd'

 perl -ne 'BEGIN{$s=0} if($.>=6) {/\$([\d.]+)/; $s+=$1} END{print "total=$s"}' d
0 голосов
/ 10 апреля 2019

Вы можете попробовать 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 голосов
/ 09 апреля 2019

Очень общее решение использует регулярное выражение с положительным взглядом:

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 голосов
/ 09 апреля 2019

Вы можете использовать awk с некоторым сопоставлением с образцом:

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