1. ホーム
  2. linux

[解決済み】ファイル内のすべての数値をすばやく合計する方法は?

2022-04-08 12:18:04

質問

数千の数字を含むファイルがあり、それぞれが独立した行になっています。

34
42
11
6
2
99
...

ファイル内のすべての数値の合計を表示するスクリプトを書きたいと思っています。解決策はあるのですが、あまり効率的ではありません。(実行に数分かかります。) もっと効率的な解決策を探しています。何か提案はありますか?

どのように解決するのですか?

Perlのワンライナーとしては、基本的に awk で解決します。 Ayman Houriehの回答 :

 % 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;