Как я могу быстро суммировать все числа в файле?

Xcode 8.3.1 - Swift 3

Это принятый ответ paulvs, преобразованный в Swift 3:

let myGroup = DispatchGroup()

override func viewDidLoad() {
    super.viewDidLoad()

    for i in 0 ..< 5 {
        myGroup.enter()
        Alamofire.request(.GET, "https://httpbin.org/get", parameters: ["foo": "bar"]).responseJSON { response in
            print("Finished request \(i)")
            myGroup.leave()
        }
    }

    myGroup.notify(queue: DispatchQueue.main, execute: {
        print("Finished all requests.")
    })
}
178
задан brian d foy 23 April 2010 в 23:54
поделиться

9 ответов

Для однострочника Perl это в основном то же самое, что и решение awk в ответ Аймана Хурье :

 % perl -nle '$sum += $_ } END { print $sum'

Если вам интересно, что делают однострочники Perl, вы можете удалить их:

 %  perl -MO=Deparse -nle '$sum += $_ } END { print $sum'

Результатом является более подробная версия программы в форме, которую никто бы никогда не написал самостоятельно:

BEGIN { $/ = "\n"; $\ = "\n"; }
LINE: while (defined($_ = <ARGV>)) {
    chomp $_;
    $sum += $_;
}
sub END {
    print $sum;
}
-e syntax OK

Просто для смеха я попробовал это с файлом, содержащим 1 000 000 чисел (в диапазоне 0 - 9 999). На моем Mac Pro он возвращается практически мгновенно. Это очень плохо, потому что я надеялся, что использование mmap будет действительно быстрым, но в то же время:

use 5.010;
use File::Map qw(map_file);

map_file my $map, $ARGV[0];

$sum += $1 while $map =~ m/(\d+)/g;

say $sum;
105
ответ дан 23 November 2019 в 20:13
поделиться

Я не мог просто пройти мимо... Вот моя острота Haskell. Это на самом деле довольно читаемо:

main = (sum <[110]gt; (read <[110]gt;) <[110]gt; lines <[110]gt; getContents) >>= print

Для разъяснения мы читаем весь вход (getContents), разделите его строками, читайте как числа и сумма. <[113]gt; fmap оператор - мы используем его вместо обычного функционального приложения, потому что уверенный это все происходит в IO. read потребности дополнительный fmap, потому что это находится также в списке.

, К сожалению, нет никакого ghci -e, чтобы просто выполнить его, таким образом, этому нужны основная функция и компиляция.

$ ghc sum.hs
[1 of 1] Compiling Main             ( sum.hs, sum.o )
Linking sum ...
$ ./sum 
1.3
2.1
4.2
7.6000000000000005

Вот странное обновление, чтобы заставить его работать с плаваниями:

main = ((0.0 + ) <[112]gt; sum <[112]gt; (read <[112]gt;) <[112]gt; lines <[112]gt; getContents) >>= print
1
ответ дан 23 November 2019 в 20:13
поделиться
sed ':a;N;s/\n/+/;ta' file|bc
2
ответ дан 23 November 2019 в 20:13
поделиться

Вы можете использовать awk :

awk '{ sum += $1 } END { print sum }' file
349
ответ дан 23 November 2019 в 20:13
поделиться

Я не знаю, сможете ли вы получить что-то лучшее, учитывая, что вам нужно прочитать файл целиком.

$sum = 0;
while(<>){
   $sum += $_;
}
print $sum;
0
ответ дан 23 November 2019 в 20:13
поделиться

Вот еще один однострочник

( echo 0 ; sed 's/$/ +/' foo ; echo p ) | dc

Предполагается, что числа являются целыми числами. Если вам нужны десятичные дроби, попробуйте

( echo 0 2k ; sed 's/$/ +/' foo ; echo p ) | dc

Отрегулируйте 2 до необходимого количества десятичных знаков.

7
ответ дан 23 November 2019 в 20:13
поделиться

Чтобы быть смешным:

cat f | tr "\n" "+" | perl -pne chop | R --vanilla --slave
-1
ответ дан 23 November 2019 в 20:13
поделиться

Это прямой Bash:

sum=0
while read -r line
do
    (( sum += line ))
done < file
echo $sum
9
ответ дан 23 November 2019 в 20:13
поделиться

Я не тестировал это, но он должен работать:

cat f | tr "\n" "+" | sed 's/+$/\n/' | bc

Возможно, вам придется добавить "\ n" к строке перед bc (например, через эхо), если bc не обрабатывает EOF и EOL ...

1
ответ дан 23 November 2019 в 20:13
поделиться
Другие вопросы по тегам:

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