Сумма числовых значений в Perl - PullRequest
0 голосов
/ 25 сентября 2018

Я новичок в написании скриптов на Perl и сейчас работаю над программой для улучшения моих знаний в Perl.Например, у меня есть входной файл, который содержит данные в виде шаблона, идентификатора транзакции, названия веб-сайта, суммы, и я пытаюсь получить сумму всех транзакций, выполненных на сайте www.example.com.Поскольку есть два числовых поля (идентификатор транзакции и сумма), я не могу выбрать только одно значение (сумму или идентификатор транзакции), используя приведенную ниже команду

$var =~ m/(\d+)/

Вот пример входного файла.

26/06/2018 12890765 www.example.com 986.00
31/08/2018 17464946 www.other.com 7627.00
1/05/2018  65472345 www.example.com 14.00

Теперь помогите мне, как я могу выбрать только 986 ​​или 7627 или 14 из файла, и поэтому здесь, если запустить код с www.example.com в качестве аргумента, я должен получить сумму как 1000.

Ответы [ 5 ]

0 голосов
/ 25 сентября 2018

Однострочное решение Perl

> cat sum_num.txt
26/06/2018 12890765 www.example.com 986.00
31/08/2018 17464946 www.other.com 7627.00
1/05/2018  65472345 www.example.com 14.00
> perl -ne ' { s/(.+)\s+(.+)$/\2/osmg;$x+=$_;print} END { print "Sum=$x\n"} ' sum_num.txt
986.00
7627.00
14.00
Sum=8627
>

Если вам нужна только сумма, удалите первый оператор печати

0 голосов
/ 25 сентября 2018

Разбейте каждую строку на пустом месте, проверьте последние два элемента - если второй справа совпадает с первым аргументом программы, добавьте последний к сумме.

#!/usr/bin/perl
use warnings;
use strict;

my $domain = shift;

my $sum = 0;
while (<>) {
    my @cells = split;
    $sum += $cells[-1] if $cells[-2] eq $domain;
}
print "$sum\n";

Вызовкак

script.pl www.example.com file.txt
0 голосов
/ 25 сентября 2018

Используйте взгляд за (?<=www\.example\.com )(\d+\.\d+) Это будет соответствовать цифре рядом с доменом, который вы дадите внутри (?<= )

демо

0 голосов
/ 25 сентября 2018

В каждой строке данных более двух чисел.Ваш \d+ будет соответствовать первым цифрам даты в начале строки.

Таким образом, вы хотите что-то, что более точно соответствует вашему номеру.Мы можем использовать тот факт, что все ваши числа имеют десятичные точки.Таким образом, ваше совпадение должно выглядеть следующим образом: \d+\.\d+.

Если сложить все вместе, ваш код может выглядеть примерно так:

my $total = 0;
my $domain = 'www.example.com';

while (<>) {
  next unless /\Q$domain/;
  $total += 1 if /(\d+\.\d+)/;
}

say "Total for $domain is $total";
0 голосов
/ 25 сентября 2018

Попробуйте этот шаблон:

$var =~ m/.+?www.example.com.+?(\d+\.\d{2})$/m

Это должно соответствовать числовым значениям в конце строки / строки, где подстрока "www.example.com" ранее появляется в строке / строке.

Интересующее вас значение будет находиться в группе захвата 1 (в perl я считаю, что по умолчанию это переменная с именем $1).

...