Unix регулярное выражение для добавления содержимого в файл - PullRequest
1 голос
/ 10 мая 2009

у меня есть содержимое в файле

как

asdfb ... 1
adfsdf ... 2
sdfdf ..   3

Я хочу написать команду unix, которая должна иметь возможность добавить 1 + 2 + 3 и дать результат как 6

Из того, что я знаю, grep и awk были бы полезны, любые указатели помогли бы.

Ответы [ 4 ]

4 голосов
/ 10 мая 2009

Я считаю, что вы ищете следующее. Он будет суммировать последнее поле в каждой записи для данных, считываемых со стандартного ввода.

awk '{ sum += $NF } END { print sum }' < file.txt

Некоторые вещи на заметку:

  1. С помощью awk вам не нужно объявлять переменные, они создаются, присваивая им значения.
  2. Переменная NF - это количество полей в текущей записи. Добавляя его к $, мы рассматриваем его значение как переменную. По крайней мере, так все и работает:)
  3. Блок END { } используется только после обработки всех записей другими блоками.
1 голос
/ 10 мая 2009

Сценарий awk - это все, что вам нужно для этого, поскольку в него встроены grep средства, встроенные в язык.

Допустим, ваш фактический файл состоит из:

asdfb zz 1
adfsdf yyy 2
sdfdf xx   3

и вы хотите сложить третий столбец. Вы можете использовать:

echo 'asdfb zz 1
adfsdf yyy 2
sdfdf xx   3' | awk '
    BEGIN {s=0;}
          {s = s + $3;}
    END   {print s;}'

Предложение BEGIN запускается до обработки любых строк, предложение END после обработки всех строк.

Другое предложение встречается для каждой строки, но вы можете добавить больше предложений, чтобы изменить поведение на основе всех видов вещей (grep -py вещей).

0 голосов
/ 10 мая 2009

Вот один в Perl.

$ cat foo.txt
asdfb ... 1
adfsdf ... 2
sdfdf ..   3

$ perl -a -n -E '$total += $F[2]; END { say $total }' foo
6

Гольф версия:

perl -anE'END{say$n}$n+=$F[2]' foo
6
0 голосов
/ 10 мая 2009

Возможно, это не то, что вы ищете, но я написал быстрый скрипт на Ruby для достижения вашей цели:

#!/usr/bin/env ruby

total = 0
while gets
    total += $1.to_i if $_ =~ /([0-9]+)$/
end
puts total
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...