2

Я хотел бы суммировать числа в текстовом файле. Есть ли как-то я могу сделать это с помощью команды или сценария Bash?

Скажем, я хочу извлечь число из шаблона, который выглядит следующим образом:

… text text …
Removed 50 items out of 50 items.
… text text …
Removed 34 items out of 50 items.
… text text …

Так что в случае выше, я хотел бы извлечь первое число в строках, которые они выскакивают и суммировать его. В примере результат должен быть 84. Я знаю, как это сделать, но это все, что я знаю о * nix командах.

4 ответа4

6

Пытаться

  grep Removed filename | awk '{sum += $2} END { print "sum=", sum }'

или же

 awk '/Removed/ { sum += $2 } END { print "sum=", sum }' filename
4

с Perl вы бы написать это:

perl -a -n -e '$sum += $F[1] if $F[0] eq "Removed"; END { print $sum }'  filename(s)

Где -a означает автоматическое разбиение на пробелы в массиве @F $ F [0] - первый элемент, где должно быть слово Removed, а $ F [1] - второй элемент.

-n означает переход по файлам, указанным в командной строке, строка за строкой

-e означает, взять следующую строку в качестве сценария (вместо файла)

Если вы работаете в собственных окнах (я вижу из комментария, упоминающего Cygwin), то вы можете использовать пакет "Padre on Strawberry" для всего этого, хотя из-за различных оболочек вы можете переключать символы "и".

1
if [ $# -ne 1 ]
then
    echo "Usage: $0   number"
    echo "       I will find sum of all digit for given number"
    echo "       For eg. $0 123, I will print 6 as sum of all digit (1+2+3)"
    exit 1
fi

n=$1
sum=0
sd=0
while [ $n -gt 0 ]
do
    sd=`expr $n % 10`
    sum=`expr $sum + $sd`
    n=`expr $n / 10`
done
    echo  "Sum of digit for numner is $sum"
1

Иногда я хочу суммировать несколько столбцов, которые появляются в файле. Этот скрипт суммирует столбцы, которые "выглядят как числовые"

#!/usr/bin/perl -w
#
# csum
#
# Sum up numerical fields in a text file
#

my $i;
my @sum;

while (<>)
{
    print;
    my @F = split;
    for $i (0..$#F)
    {
        if ($F[$i] =~ /^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/)
        {
            $sum[$i] += $F[$i];
        }
    }
}

print "-" x 75 . "\n";
print join "\t", map {$_ or ""} @sum;
print "\n";

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .