Команда оболочки для суммирования целых чисел, по одному на строку?

Новый ответ с использованием структуры агрегации Mongo

После того, как этот вопрос был задан и ответил, 10gen выпустил версию Mongodb версии 2.2 с базой агрегации. Новый лучший способ сделать этот запрос:

db.col.aggregate( [
   { $group: { _id: { userId: "$userId", name: "$name" },
               count: { $sum: 1 } } },
   { $match: { count: { $gt: 1 } } },
   { $project: { _id: 0, 
                 userId: "$_id.userId", 
                 name: "$_id.name", 
                 count: 1}}
] )

10gen имеет удобную SQL-диаграмму преобразования агрегатов Mongo Aggregation .

780
задан 9 revs, 7 users 38% 10 April 2019 в 04:04
поделиться

16 ответов

Бит awk должен сделать это?

awk '{s+=$1} END {print s}' mydatafile

Примечание: некоторые версии awk имеют некоторые нечетные поведения, если Вы собираетесь быть добавлением чего-нибудь превышение 2^31 (2147483647). См. комментарии для большего количества фона. Одно предложение должно использовать printf, а не print:

awk '{s+=$1} END {printf "%.0f", s}' mydatafile
1212
ответ дан 3 revs 10 April 2019 в 04:04
поделиться
  • 1
    Хороший вопрос. Вероятно. Вы могли, конечно, также обработать каждую таблицу 5 (или 7..) строки за один раз... Но тогда я предполагаю, что можно нарушать ограничения памяти. – aioobe 8 October 2010 в 06:13

Следующее должно работать (предположение, что Ваше число является вторым полем на каждой строке).

awk 'BEGIN {sum=0} \
 {sum=sum + $2} \
END {print "tot:", sum}' Yourinputfile.txt
3
ответ дан James Anderson 10 April 2019 в 04:04
поделиться
  • 1
    Спасибо за объяснение! Этот вопрос много раз задавали и " Используйте ' Медиана Medians' " ответ много раз давался, но это - первый раз I' ve нашел кого-то, кто дал объяснение. (Wikipedia' s статья показался мне немногим также... тупым?) – ArtOfWarfare 5 June 2012 в 12:31

Можно сделать это в Python, если Вы чувствуете себя комфортно:

Не протестированный, просто введенный:

out = open("filename").read();
lines = out.split('\n')
ints = map(int, lines)
s = sum(ints)
print s

Sebastian указал на один сценарий лайнера:

cat filename | python -c"from fileinput import input; print sum(map(int, input()))"
3
ответ дан Tiago 10 April 2019 в 04:04
поделиться
  • 1
    @aioobe, набор числа является слишком большим для вписывания в память, поэтому даже если мы можем найти эти median of medians, как мы можем сделать quick select? – Alcott 11 October 2011 в 02:25

Версия остроты в Python:

$ python -c "import sys; print(sum(int(l) for l in sys.stdin))"
114
ответ дан 2 revs, 2 users 89% 10 April 2019 в 04:04
поделиться
  • 1
    Спасибо за Ваш вход! 2. Shouldnt я устанавливаю плагин тестирования в Jenkins, если я использую тестирование с WebDriver? 3. В моем Java кодируют I haven' t определенные серверы, ни порты, вот что I' ve определил: 'ProfilesIni представляют = новый ProfilesIni (); FirefoxProfile ffprofile = profile.getProfile (" SELENIUM"); драйвер = новый FirefoxDriver (ffprofile)'; Если я добавляю что-то здесь о хостах и портах, и если " yes" - что точно? 5. Я don' t знают что " версия control": (. Мой код помещается в папку рабочей области, названную " testingMyApp" и там все файлы. На моем диске c – J. K. 18 July 2013 в 12:37

одно простое решение должно было бы записать программу, чтобы сделать это для Вас. Это могло, вероятно, быть сделано довольно быстро в Python, чем-то как:

sum = 0
file = open("numbers.txt","R")
for line in file.readlines(): sum+=int(line)
file.close()
print sum

я не протестировал тот код, но это выглядит правильным. Просто измените numbers.txt на название файла, сохраните код в файл, названный sum.py, и в консольном типе в "Python sum.py"

0
ответ дан Matt Boehm 10 April 2019 в 04:04
поделиться
  • 1
    ... кривые Безье были бы (я думать), обеспечивают очень хорошую очистку. Но it' d также приносят некоторую бонусную пользу, как создание регионов повышения, можно выбрать щелчком мышью (который был бы очень очень прохладен!) – benjismith 4 November 2008 в 21:23

Вставка обычно объединяет строки нескольких файлов, но она может также использоваться для преобразования отдельных строк файла в одну строку. Флаг разделителя позволяет Вам передавать уравнение типа x+x до н.э

paste -s -d+ infile | bc

, С другой стороны, при передаче по каналу от stdin,

<commands> | paste -s -d+ - | bc
627
ответ дан 5 revs, 5 users 33% 10 April 2019 в 04:04
поделиться

Простой удар:

$ cat numbers.txt 
1
2
3
4
5
6
7
8
9
10
$ sum=0; while read num; do ((sum += num)); done < numbers.txt; echo $sum
55
73
ответ дан 2 revs, 2 users 97% 10 April 2019 в 04:04
поделиться
  • 1
    2. Плагин для построения графиков результата испытаний, не для фактического выполнения теста, не необходимости тогда. 3. docs.seleniumhq.org/docs/03_webdriver.jsp драйвер WebDriver = новый FirefoxDriver (); driver.get (" Google com" ); 5. That' s плохо, you' d скорее начинают читать. используйте ' git' и ' subversion' как ключевые слова. 6. Тот же безошибочный плагин знатока ре предложения. Быстрое гугление возвратилось 176.34.122.30/blog/2008/09/17/… , это похоже на обеспечение некоторого хорошего знатока xml для surefire+selenium. – patrungel 19 July 2013 в 08:23

Следующие работы в ударе:

I=0

for N in `cat numbers.txt`
do
    I=`expr $I + $N`
done

echo $I
11
ответ дан Francisco Canedo 10 April 2019 в 04:04
поделиться
dc -f infile -e '[+z1<r]srz1<rp'

Примечание, что отрицательные числа, снабженные префиксом знак "минус", должны быть переведены для dc, так как это использует _ префикс, а не - префикс для этого. Например, через tr '-' '_' | dc -f- -e '...'.

Редактирование: Так как этот ответ получил столько голосов "за мрак", вот подробное объяснение:

выражение [+z1<r]srz1<rp делает следующий :

[   interpret everything to the next ] as a string
  +   push two values off the stack, add them and push the result
  z   push the current stack depth
  1   push one
  <r  pop two values and execute register r if the original top-of-stack (1)
      is smaller
]   end of the string, will push the whole thing to the stack
sr  pop a value (the string above) and store it in register r
z   push the current stack depth again
1   push 1
<r  pop two values and execute register r if the original top-of-stack (1)
    is smaller
p   print the current top-of-stack

Как псевдокод:

  1. Определяют "add_top_of_stack" как:
    1. Удаляют два главных значения от стека и добавляют результат назад
    2. , Если стек имеет два или больше значения, выполните "add_top_of_stack" рекурсивно
  2. , Если стек имеет два или больше значения, выполненная Печать "add_top_of_stack"
  3. результат, теперь единственный объект, оставленный в стеке

Для реального понимания простоты и питания dc, вот является рабочим сценарием Python, который реализует некоторые команды от dc и выполняет версию Python вышеупомянутой команды:

### Implement some commands from dc
registers = {'r': None}
stack = []
def add():
    stack.append(stack.pop() + stack.pop())
def z():
    stack.append(len(stack))
def less(reg):
    if stack.pop() < stack.pop():
        registers[reg]()
def store(reg):
    registers[reg] = stack.pop()
def p():
    print stack[-1]

### Python version of the dc command above

# The equivalent to -f: read a file and push every line to the stack
import fileinput
for line in fileinput.input():
    stack.append(int(line.strip()))

def cmd():
    add()
    z()
    stack.append(1)
    less('r')

stack.append(cmd)
store('r')
z()
stack.append(1)
less('r')
p()
63
ответ дан 5 revs, 4 users 92% 10 April 2019 в 04:04
поделиться
  • 1
    я должен установить безошибочный плагин, или он включен в установку знатока? Затем я использую фазу интеграционного теста в качестве спецификации в АНГЛИЧАНИНЕ? Как я знаю, какую версию тестирования я использую так, я определяю что правильно в АНГЛИЧАНИНЕ? Я загружаю исходный код на сервере с jenkins или в некотором другом местоположении? – J. K. 22 July 2013 в 08:51

Я думаю, что AWK - то, что Вы ищете:

awk '{sum+=$1}END{print sum}'

можно использовать эту команду или путем передачи списка чисел через стандартный вход или путем передачи файла, содержащего числа в качестве параметра.

11
ответ дан 3 revs, 3 users 67% 10 April 2019 в 04:04
поделиться
perl -lne '$x += $_; END { print $x; }' < infile.txt
36
ответ дан j_random_hacker 10 April 2019 в 04:04
поделиться
  • 1
    Счастливый распространить справку вперед... Я узнал о много из них. – PengOne 1 July 2011 в 21:25

Решение для Bash, если Вы хотите сделать это командой (например, если необходимо часто делать это):

addnums () {
  local total=0
  while read val; do
    (( total += val ))
  done
  echo $total
}

Тогда использование:

addnums < /tmp/nums
17
ответ дан 3 revs, 3 users 80% 10 April 2019 в 04:04
поделиться
sed 's/^/.+/' infile | bc | tail -1
9
ответ дан 2 revs, 2 users 67%Dominique 10 April 2019 в 04:04
поделиться

Вы можете с помощью цифры-utils, хотя это может быть излишество для того, в чем Вы нуждаетесь. Это - ряд программ для управления числами в оболочке и может сделать несколько изящных вещей, включая, конечно, сложив их. Это немного устарело, но они все еще работают и могут быть полезными, если необходимо сделать что-то больше.

http://suso.suso.org/programs/num-utils/

11
ответ дан sykora 10 April 2019 в 04:04
поделиться
$ cat n
2
4
2
7
8
9
$ perl -MList::Util -le 'print List::Util::sum(<>)' < n
32

Или вы можете ввести числа в командной строке:

$ perl -MList::Util -le 'print List::Util::sum(<>)'
1
3
5
^D
9

Однако этот файл приводит к потере файла, поэтому его не рекомендуется использовать для больших файлов. См. ответ j_random_hacker , который позволяет избежать хлюпания.

2
ответ дан 22 November 2019 в 21:17
поделиться

Я понимаю, что это старый вопрос, но мне достаточно нравится это решение, чтобы поделиться им.

% cat > numbers.txt
1 
2 
3 
4 
5
^D
% cat numbers.txt | perl -lpe '$c+=$_}{$_=$c'
15

Если есть интерес, я объясню, как это работает.

9
ответ дан 22 November 2019 в 21:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: