আমি কীভাবে দ্রুত একটি ফাইলের সমস্ত সংখ্যার যোগ করতে পারি?


194

আমার কাছে একটি ফাইল রয়েছে যার মধ্যে কয়েক হাজার সংখ্যা রয়েছে যার প্রতিটি তার নিজস্ব লাইনে রয়েছে:

34
42
11
6
2
99
...

আমি একটি স্ক্রিপ্ট লিখতে চাইছি যা ফাইলের সমস্ত সংখ্যার যোগফল মুদ্রণ করবে। আমি একটি সমাধান পেয়েছি, তবে এটি খুব দক্ষ নয়। (এটি চালাতে কয়েক মিনিট সময় নেয়)) আমি আরও কার্যকর সমাধানের সন্ধান করছি। কোনও পরামর্শ?


5
আপনার ধীর সমাধান কি ছিল? এটি সম্পর্কে ধীরগতিতে আমরা কী সাহায্য করতে পারি তা আমরা আপনাকে সহায়তা করতে পারি। :)
ব্রায়ান ডি বন্ধু

4
@ ব্রায়ান ডি, আমি এটি পোস্ট করতে খুব বিব্রত বোধ করছি। আমি জানি এটা কেন ধীর। এটি কারণ আমি শীর্ষ নম্বর পেতে "বিড়াল ফাইলের নাম | শীর্ষ -n 1" কল করে এটি একটি চলমান মোটে যুক্ত করুন এবং পরের পুনরাবৃত্তির জন্য শীর্ষ রেখাটি সরাতে "বিড়াল ফাইলের নাম | লেজ ..." কল করুন ... আমি প্রোগ্রামিং সম্পর্কে অনেক কিছু শিখতে হবে !!!
মার্ক রবার্টস

6
এটা ... খুব নিয়মতান্ত্রিক। খুব স্পষ্ট এবং সরাসরি এগিয়ে, এবং আমি এটি সমস্ত কিছুর জন্য এটি একটি ভয়ঙ্কর ঘৃণা পছন্দ। তৈরি, আমি ধরে নিয়েছি, আপনি যে সরঞ্জামগুলি শুরু করেছিলেন ঠিক সেগুলি থেকে আপনি ঠিক জানেন?
dmckee --- প্রাক্তন মডারেটর বিড়ালছানা

4
পূর্ণ ডুপ্লিকেট: stackoverflow.com/questions/450799/...
codeholic

@ মার্করবার্টস এটি কার্যকর করতে অবশ্যই আপনাকে অনেক সময় নিয়েছে। এটি সমাধানের কৌশলটি খুব ক্লিয়ারভার এবং ওহ এত ভুল। এটি ওভার থিওকের ক্লাসিক কেসের মতো দেখাচ্ছে। বিভিন্ন গ্লেন জ্যাকম্যান এর সমাধান শেল স্ক্রিপ্টিং সমাধান (এবং দুই বিশুদ্ধ শেল ভালো জিনিস ব্যবহার করবেন না যে awkbc)। এগুলি 10 সেকেন্ডেরও কম সময়ে এক মিলিয়ন সংখ্যা যুক্ত করেছে adding এগুলি একবার দেখুন এবং খাঁটি শেল এ এটি কীভাবে করা যায় তা দেখুন।
ডেভিড ডব্লিউ।

উত্তর:


113

পার্ল ওয়ান-লাইনারের awkক্ষেত্রে এটি আয়মান হৌরিহের উত্তরের সমাধান হিসাবে একই জিনিস :

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

পার্ল ওয়ান-লাইনার যা করেন তা যদি আপনি আগ্রহী হন তবে আপনি সেগুলি ছাড়িয়ে নিতে পারেন:

 %  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 এর মধ্যে রয়েছে) দিয়ে চেষ্টা করেছি। আমার ম্যাক প্রোতে এটি তাত্ক্ষণিকভাবে ফিরে আসে। এটি খুব খারাপ, কারণ আমি আশা করি ব্যবহার 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;

4
বাহ, এটি কোড-এনলে আসলে আপনি যে স্ট্রিংটি দিয়েছেন তার চারপাশে কী জড়িত তা একটি গভীর বোঝাপড়া দেখায় । আমার প্রাথমিক ধারণাটি ছিল যে মাদকাসক্তি করার সময় আপনার পোস্ট করা উচিত নয় তবে আমি খেয়াল করেছিলাম আপনি কে এবং আপনার কিছু পার্ল উত্তরগুলি স্মরণ করেছে :-)
প্যাক্সিডিয়াবল

-n এবং -p কেবল -e তে আর্গুমেন্টের চারপাশে অক্ষরগুলি রেখে দেয়, যাতে আপনি যা চান তার জন্য আপনি এই অক্ষরগুলি ব্যবহার করতে পারেন। আমাদের কাছে প্রচুর ওয়ান-লাইনার রয়েছে যা কার্যকর পার্ল প্রোগ্রামিং (যা তাকগুলিতে আঘাত করতে চলেছে) এর সাথে আকর্ষণীয় কাজ করে।
brian d foy

5
ভাল লাগছে, এই অ-ম্যাচিং কোঁকড়ানো ধনুর্বন্ধনী সম্পর্কে কি?
ফ্রাঙ্ক

17
-n while { }আপনার প্রোগ্রামের চারপাশে লুপ যুক্ত করে । আপনি যদি } ... {ভিতরে .োকান, তবে আপনার আছে while { } ... { }। ইভিল? সামান্য।
jrockway

5
-MO=Deparseবিকল্পটি হাইলাইট করার জন্য বড় বোনাস ! যদিও আলাদা বিষয়ে topic
সংযোগ

374

আপনি awk ব্যবহার করতে পারেন:

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

3
প্রোগ্রাম অতিক্রম করেছে: ক্ষেত্রের আকারের সর্বাধিক সংখ্যা: 32767
লিফ

1
সঙ্গে -F '\t'বিকল্প যদি আপনার ক্ষেত্র খালি জায়গা থাকা এবং ট্যাব দ্বারা বিভক্ত করা হয়।
ইথান ফুরম্যান

5
এটি সেরা উত্তর হিসাবে চিহ্নিত করুন। আপনি যদি টিএসভি (ট্যাব-বিভাজিত মান) ফাইলের মধ্যে প্রতিটি সারিতে প্রথম মান যোগ করতে চান তবে এটিও কাজ করে।
Andrea

99

সমাধানের এতদূর ব্যবহার হয় না paste। এখানে একটি:

paste -sd+ filename | bc

উদাহরণ হিসাবে, এখানে হিসাব করুন যেখানে 1 <= n <= 100000:

$ seq 100000 | paste -sd+ | bc -l
5000050000

(কৌতুহলী জন্য, seq nথেকে সংখ্যার একটি ক্রম প্রিন্ট হবে 1থেকে nদেওয়া একটি ধনাত্মক সংখ্যা n।)


1
খুব সুন্দর! এবং মনে রাখা সহজ
ব্রেন্ডন মাগুয়ের

1
seq 100000 | paste -sd+ - | bc -lম্যাক ওএস এক্স ব্যাশ শেলের উপর। এবং এটি এখন পর্যন্ত সবচেয়ে মধুর এবং অনন্য সমাধান!
সিমো এ।

1
@SimoA। আমি ভোট দিয়েছি যে আমরা ইউনিক্সেস্টের স্থলে ইউনিক্সেস্ট শব্দটি ব্যবহার করি কারণ যৌনতম সমাধানের ক্ষেত্রে সর্বদা অনন্যতম থাকে;)
কনার

86

শুধু মজাদার জন্য, আসুন এটি মাপদণ্ড করুন:

$ for ((i=0; i<1000000; i++)) ; do echo $RANDOM; done > random_numbers

$ time perl -nle '$sum += $_ } END { print $sum' random_numbers
16379866392

real    0m0.226s
user    0m0.219s
sys     0m0.002s

$ time awk '{ sum += $1 } END { print sum }' random_numbers
16379866392

real    0m0.311s
user    0m0.304s
sys     0m0.005s

$ time { { tr "\n" + < random_numbers ; echo 0; } | bc; }
16379866392

real    0m0.445s
user    0m0.438s
sys     0m0.024s

$ time { s=0;while read l; do s=$((s+$l));done<random_numbers;echo $s; }
16379866392

real    0m9.309s
user    0m8.404s
sys     0m0.887s

$ time { s=0;while read l; do ((s+=l));done<random_numbers;echo $s; }
16379866392

real    0m7.191s
user    0m6.402s
sys     0m0.776s

$ time { sed ':a;N;s/\n/+/;ta' random_numbers|bc; }
^C

real    4m53.413s
user    4m52.584s
sys 0m0.052s

আমি 5 মিনিটের পরে সেড রান বাতিল করে দিয়েছি


আমি ডাইভিং করা হয়েছে , এবং এটি দ্রুত:

$ time lua -e 'sum=0; for line in io.lines() do sum=sum+line end; print(sum)' < random_numbers
16388542582.0

real    0m0.362s
user    0m0.313s
sys     0m0.063s

এবং আমি এটি আপডেট করার সময়, রুবি:

$ time ruby -e 'sum = 0; File.foreach(ARGV.shift) {|line| sum+=line.to_i}; puts sum' random_numbers
16388542582

real    0m0.378s
user    0m0.297s
sys     0m0.078s

হেড এড মর্টনের পরামর্শ: ব্যবহার $1

$ time awk '{ sum += $1 } END { print sum }' random_numbers
16388542582

real    0m0.421s
user    0m0.359s
sys     0m0.063s

বনাম ব্যবহার করে $0

$ time awk '{ sum += $0 } END { print sum }' random_numbers
16388542582

real    0m0.302s
user    0m0.234s
sys     0m0.063s

18
+1: একগুচ্ছ সমাধানের সাথে আসার জন্য এবং সেগুলি বেনমার্ক করার জন্য।
ডেভিড ডব্লিউ।

সময় বিড়াল random_numbers | পেস্ট -sd + + | বিসি -l বাস্তব 0m0.317s ব্যবহারকারী 0m0.310s sys 0m0.013s
উইনার রাফি

এটি trসমাধানের প্রায় একরকম হওয়া উচিত ।
গ্লেন জ্যাকম্যান

4
আপনার awk স্ক্রিপ্টটি কিছুটা দ্রুত সম্পাদন করা উচিত যদি আপনি যেহেতু উইকের $0পরিবর্তে $1ফিল্ড বিভাজন করেন (যা স্পষ্টতই সময় নেয়) যদি কোনও ক্ষেত্রের স্ক্রিপ্টে নির্দিষ্টভাবে উল্লেখ করা হয় তবে অন্যথায় না হয়।
এড মর্টন

20

অন্য বিকল্পটি হ'ল jq:

$ seq 10|jq -s add
55

-s( --slurp) একটি অ্যারেতে ইনপুট লাইনগুলি পড়ে।


1
এটি এর মতো দ্রুত কাজের জন্য একটি দুর্দান্ত সরঞ্জাম, এটি প্রায় ভুলে গিয়েছিল। ধন্যবাদ
জন

9

এটি সোজা বাশ:

sum=0
while read -r line
do
    (( sum += line ))
done < file
echo $sum

2
এবং এটি সম্ভবত ধীরতম সমাধানগুলির মধ্যে একটি এবং তাই বিপুল পরিমাণে সংখ্যার জন্য এতটা উপযুক্ত নয়।
ডেভিড

7

এখানে অন্য একটি লাইনার আছে

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

এটি অনুমান করে যে সংখ্যাগুলি পূর্ণসংখ্যা হয়। আপনার দশমিকের দরকার হলে চেষ্টা করুন

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

দশমিকের প্রয়োজনীয় সংখ্যার সাথে 2 সামঞ্জস্য করুন।


6

আমি এই জাতীয় কাজের জন্য জিএনইউ দাতাম্যাশ ব্যবহার করতে পছন্দ করি কারণ এটি পার্ল বা অজকের চেয়ে বেশি সংযুক্ত এবং সুস্পষ্ট। উদাহরণ স্বরূপ

datamash sum 1 < myfile

যেখানে 1 ডেটার প্রথম কলামকে বোঝায়।


1
এটি আমার উবুন্টু ইনস্টলেশনতে দেখতে না পাওয়ায় এটি কোনও মানক উপাদান হিসাবে উপস্থিত হয় না। যদিও এটি বেঞ্চমার্কযুক্ত দেখতে চাই।
স্টিভেন দ্য ইজেলি অ্যামিউজড


5

আমি এর জন্য আর ব্যবহার করতে পছন্দ করি:

$ R -e 'sum(scan("filename"))'

অন্যান্য অ্যাপ্লিকেশনগুলির জন্য আমি আর এর অনুরাগী তবে এইভাবে পারফর্মেন্সের পক্ষে এটি ভাল নয়। ফাইল আই / ও একটি বড় সমস্যা। আমি কোনও স্ক্রিপ্টে আর্গগুলি পাস করার পরীক্ষা করেছি যা ভ্রূম প্যাকেজটি ব্যবহার করে দ্রুত বাড়ানো যেতে পারে। আমি যখন একই সার্ভারে কিছু অন্যান্য স্ক্রিপ্টগুলি বেঞ্চমার্ক করেছি তখন আমি আরও বিশদ পোস্ট করব।
টম কেলি

4
cat nums | perl -ne '$sum += $_ } { print $sum'

('শেষ' ছাড়াই ব্রায়ান ডি ফোয়ের উত্তর হিসাবে একই)


আমি এটি পছন্দ করি তবে আপনি কি কোঁকড়ানো বন্ধনীগুলি ব্যাখ্যা করতে পারেন? এটি} ছাড়া {এবং তদ্বিপরীত দেখতে অদ্ভুত।
17:40

1
perl -MO=Deparseপার্ল কীভাবে প্রোগ্রামটি পার্স করে তা দেখতে @ ড্রামফায়ার উপরে @ ব্রায়ান ডি ফয়ের উত্তর দেখুন। বা পারল্রুনের জন্য দস্তাবেজগুলি: perldoc.perl.org/perlrun.html (-n এর জন্য অনুসন্ধান করুন)। পার্ল আপনার কোডটি {with দিয়ে মোড় করে যদি আপনি -n ব্যবহার করেন তবে এটি একটি সম্পূর্ণ প্রোগ্রামে পরিণত হয়।
edibleEnergy

4

আরও সংহত:

# Ruby
ruby -e 'puts open("random_numbers").map(&:to_i).reduce(:+)'

# Python
python -c 'print(sum(int(l) for l in open("random_numbers")))'

ভাসমানে রূপান্তর করা আমার সিস্টেমে প্রায় দ্বিগুণ দ্রুত (320 বনাম 640 এমএস) দ্রুত বলে মনে হচ্ছে। time python -c "print(sum([float(s) for s in open('random_numbers','r')]))"
ব্যবহারকারী 12719


3

কেবল মজাদার জন্য, এটি পিডিএল , পারেলের অ্যারে ম্যাথ ইঞ্জিন দিয়ে করুন!

perl -MPDL -E 'say rcols(shift)->sum' datafile

rcolsকলামগুলি একটি ম্যাট্রিক্সে (এই ক্ষেত্রে 1D) পড়ে এবং sum(আশ্চর্য) ম্যাট্রিক্সের সমস্ত উপাদানটির যোগফল দেয়।


@LC- এ PDL.pm সনাক্ত করতে পারে না (আপনার PDL মডিউলটি ইনস্টল করার দরকার হতে পারে) (@INC এতে রয়েছে: / etc / perl /usr/local/lib/x86_64-linux-gnu/perl/5.22.1? )) অবশ্যই
ফোর্টরান

1
আপনাকে প্রথমে PDL ইনস্টল করতে হবে, এটি পার্ল নেটিভ মডিউল নয়।
জোয়েল বার্গার

3

জেনারেটর এক্সপ্রেশন সহ পাইথন ব্যবহার করে এখানে একটি সমাধান দেওয়া হল। আমার পুরানো ক্রুডি ল্যাপটপে এক মিলিয়ন নম্বর নিয়ে পরীক্ষিত।

time python -c "import sys; print sum((float(l) for l in sys.stdin))" < file

real    0m0.619s
user    0m0.512s
sys     0m0.028s

3
নামকরণের ফাংশন সহ একটি সাধারণ তালিকা অনুধাবন হ'ল একটি দুর্দান্ত ব্যবহারের ক্ষেত্রে map():map(float, sys.stdin)
সেভকো

3

আমি কেবল পাশ দিয়ে যেতে পারিনি ... এখানে আমার হাস্কেল ওয়ান-লাইনার। এটি আসলে বেশ পঠনযোগ্য:

sum <$> (read <$>) <$> lines <$> getContents

দুর্ভাগ্যক্রমে ghci -eএটি চালানোর কোনও নেই , সুতরাং এটির মূল ফাংশন, মুদ্রণ এবং সংকলন প্রয়োজন।

main = (sum <$> (read <$>) <$> lines <$> getContents) >>= print

নির্মল করার জন্য, আমরা সমগ্র ইনপুট (পড়া getContents), দ্বারা এটি বিভক্ত lines, readসংখ্যা এবং যেমন sum<$>হয় fmapঅপারেটর - আমরা স্বাভাবিক ফাংশন প্রয়োগের পরিবর্তে এটি ব্যবহার কারণ নিশ্চিত এই সব আই ঘটে। readঅতিরিক্ত দরকার fmap, কারণ এটি তালিকায়ও রয়েছে।

$ ghc sum.hs
[1 of 1] Compiling Main             ( sum.hs, sum.o )
Linking sum ...
$ ./sum 
1
2
4
^D
7

এটির সাথে কাজ করার জন্য একটি অদ্ভুত আপগ্রেড:

main = ((0.0 + ) <$> sum <$> (read <$>) <$> lines <$> getContents) >>= print
$ ./sum 
1.3
2.1
4.2
^D
7.6000000000000005


2

আর স্ক্রিপ্ট চালাচ্ছে

আমি একটি ফাইলের নামের যুক্তি নিতে এবং লাইনগুলি যোগ করতে একটি আর স্ক্রিপ্ট লিখেছি।

#! /usr/local/bin/R
file=commandArgs(trailingOnly=TRUE)[1]
sum(as.numeric(readLines(file)))

এটি "ডেটা টেটেবল" বা "ভ্রুম" প্যাকেজটি নিম্নরূপভাবে বাড়িয়ে দেওয়া যেতে পারে:

#! /usr/local/bin/R
file=commandArgs(trailingOnly=TRUE)[1]
sum(data.table::fread(file))
#! /usr/local/bin/R
file=commandArgs(trailingOnly=TRUE)[1]
sum(vroom::vroom(file))

স্থির করা মাপকাঠি

@ বেগেন জ্যাকম্যান হিসাবে একই বেঞ্চমার্কিং ডেটা ।

for ((i=0; i<1000000; i++)) ; do echo $RANDOM; done > random_numbers

উপরের আর কলটির তুলনায়, স্ক্রিপ্ট হিসাবে আর 3.5.0 চালানো অন্যান্য পদ্ধতির সাথে (একই লিনাক্স ডেবিয়ান সার্ভারে) তুলনাযোগ্য ble

$ time R -e 'sum(scan("random_numbers"))'  
 0.37s user
 0.04s system
 86% cpu
 0.478 total

রিডলাইনস সহ আর স্ক্রিপ্ট

$ time Rscript sum.R random_numbers
  0.53s user
  0.04s system
  84% cpu
  0.679 total

Data.table সহ আর স্ক্রিপ্ট

$ time Rscript sum.R random_numbers     
 0.30s user
 0.05s system
 77% cpu
 0.453 total

ভর্ম সহ আর স্ক্রিপ্ট

$ time Rscript sum.R random_numbers     
  0.54s user 
  0.11s system
  93% cpu
  0.696 total

অন্যান্য ভাষার সাথে তুলনা

রেফারেন্সের জন্য একই হার্ডওয়্যারে প্রস্তাবিত কিছু অন্যান্য পদ্ধতি হিসাবে

পাইথন 2 (2.7.13)

$ time python2 -c "import sys; print sum((float(l) for l in sys.stdin))" < random_numbers 
 0.27s user 0.00s system 89% cpu 0.298 total

পাইথন 3 (3.6.8)

$ time python3 -c "import sys; print(sum((float(l) for l in sys.stdin)))" < random_number
0.37s user 0.02s system 98% cpu 0.393 total

রুবি (২.৩.৩)

$  time ruby -e 'sum = 0; File.foreach(ARGV.shift) {|line| sum+=line.to_i}; puts sum' random_numbers
 0.42s user
 0.03s system
 72% cpu
 0.625 total

পার্ল (5.24.1)

$ time perl -nle '$sum += $_ } END { print $sum' random_numbers
 0.24s user
 0.01s system
 99% cpu
 0.249 total

অজগর (৪.১.৪)

$ time awk '{ sum += $0 } END { print sum }' random_numbers
 0.26s user
 0.01s system
 99% cpu
 0.265 total
$ time awk '{ sum += $1 } END { print sum }' random_numbers
 0.34s user
 0.01s system
 99% cpu
 0.354 total

সি (ঝনঝন সংস্করণ 3.3; জিসিসি (দেবিয়ান 6.3.0-18) 6.3.0)

 $ gcc sum.c -o sum && time ./sum < random_numbers   
 0.10s user
 0.00s system
 96% cpu
 0.108 total

অতিরিক্ত ভাষা সহ আপডেট করুন

লুয়া (5.3.5)

$ time lua -e 'sum=0; for line in io.lines() do sum=sum+line end; print(sum)' < random_numbers 
 0.30s user 
 0.01s system
 98% cpu
 0.312 total

টিআর (৮.২ b) অবশ্যই বাশে সময়সই হতে হবে, zsh এর সাথে সামঞ্জস্যপূর্ণ নয়

$time { { tr "\n" + < random_numbers ; echo 0; } | bc; }
real    0m0.494s
user    0m0.488s
sys 0m0.044s

সেড (৪.৪) অবশ্যই ব্যাশের সাথে সময়সই করা উচিত, zsh এর সাথে সামঞ্জস্যপূর্ণ নয়

$  time { head -n 10000 random_numbers | sed ':a;N;s/\n/+/;ta' |bc; }
real    0m0.631s
user    0m0.628s
sys     0m0.008s
$  time { head -n 100000 random_numbers | sed ':a;N;s/\n/+/;ta' |bc; }
real    1m2.593s
user    1m2.588s
sys     0m0.012s

দ্রষ্টব্য: সেড কলগুলি আরও মেমরির উপলব্ধ সিস্টেমগুলিতে দ্রুত কাজ করে বলে মনে হচ্ছে (বেঞ্চমার্কিং সেডের জন্য ব্যবহৃত ছোট ছোট ডেটাসেটগুলি নোট করুন)

জুলিয়া (০.০.০)

$ time julia -e 'print(sum(readdlm("random_numbers")))'
 3.00s user 
 1.39s system 
 136% cpu 
 3.204 total
$  time julia -e 'print(sum(readtable("random_numbers")))'
 0.63s user 
 0.96s system 
 248% cpu 
 0.638 total

লক্ষ করুন যে আর এর মতো ফাইল আই / ও পদ্ধতিতে ভিন্ন ভিন্ন কর্মক্ষমতা রয়েছে।


2

সি ++ "ওয়ান-লাইনার":

#include <iostream>
#include <iterator>
#include <numeric>
using namespace std;

int main() {
    cout << accumulate(istream_iterator<int>(cin), istream_iterator<int>(), 0) << endl;
}

1

মজা করার জন্য অন্য একটি

sum=0;for i in $(cat file);do sum=$((sum+$i));done;echo $sum

বা অন্য কোনও বাশ

s=0;while read l; do s=$((s+$l));done<file;echo $s

এটি সবচেয়ে কমপ্যাক্ট হিসাবে তবে অ্যাডাব্লিক সমাধান সম্ভবত সেরা।


1

সি সর্বদা গতির জন্য জয়ী হয়:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv) {
    ssize_t read;
    char *line = NULL;
    size_t len = 0;
    double sum = 0.0;

    while (read = getline(&line, &len, stdin) != -1) {
        sum += atof(line);
    }

    printf("%f", sum);
    return 0;
}

1 এম সংখ্যার জন্য সময় (আমার পাইথনের উত্তরের মতো একই মেশিন / ইনপুট):

$ gcc sum.c -o sum && time ./sum < numbers 
5003371677.000000
real    0m0.188s
user    0m0.180s
sys     0m0.000s

1
সর্বোত্তম উত্তর! সেরা গতি)
ফোর্টরান

1

রুবি সহ:

ruby -e "File.read('file.txt').split.inject(0){|mem, obj| mem += obj.to_f}"

আরেকটি বিকল্প (যখন ইনপুটটি এসটিডিআইএন থেকে হয়) হ'ল ruby -e'p readlines.map(&:to_f).reduce(:+)'
নিসেতামা

0

আপনার পুরো ফাইলটি পড়ার দরকার বিবেচনা করে আপনি এর থেকে আরও ভাল কিছু অর্জন করতে পারেন কিনা তা আমি জানি না।

$sum = 0;
while(<>){
   $sum += $_;
}
print $sum;

1
খুব পঠনযোগ্য। পার্ল জন্য। তবে হ্যাঁ, এটি এমন কিছু হতে
চলেছে

$_ডিফল্ট পরিবর্তনশীল। লাইন ইনপুট অপারেটর, <>, রাখে এটা ফলাফলের সেখানে ডিফল্ট ভাবে আপনার ব্যবহার করলে <>মধ্যে while
brian d foy

1
@ মার্ক, $_বিষয় পরিবর্তনশীল - এটি 'এটি' এর মতো কাজ করে। এই ক্ষেত্রে <> এটি প্রতিটি লাইন বরাদ্দ করে। কোড বিশৃঙ্খলা হ্রাস করতে এবং ওয়ান-লাইন লেখার ক্ষেত্রে সহায়তা করার জন্য এটি বেশ কয়েকটি জায়গায় ব্যবহৃত হয়। স্ক্রিপ্টটি বলে "যোগফলকে 0 তে সেট করুন, প্রতিটি লাইনটি পড়ুন এবং যোগফলটিতে যোগ করুন, তারপরে যোগফলটি মুদ্রণ করুন।"
দাওতাদ

1
সতর্কতা ও কঠোরতা বন্ধ করে @ স্টেফান, আপনি ঘোষণা এবং সূচনা এড়াতে পারবেন $sum। যেহেতু এটি খুব সহজ, আপনি এমনকি একটি বিবৃতি সংশোধক ব্যবহার করতে পারেন while:$sum += $_ while <>; print $sum;
ডায়োটাড

0

আমি এটি পরীক্ষা করেছি না তবে এটি কাজ করা উচিত:

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

বিসি ইওএফ এবং ইওএলকে চিকিত্সা না করে যদি আপনাকে বিসি এর আগে স্ট্রিংয়ের সাথে "\ n" যুক্ত করতে হতে পারে (প্রতিধ্বনি মাধ্যমে) ...


2
এটি কাজ করে না। bcপিছনে "+" এবং শেষদিকে নতুন লাইনের অভাবের কারণে একটি বাক্য গঠন ত্রুটি জারি করে। এটি কাজ করবে এবং এটি এর অকেজো ব্যবহারকে বাদ দেয় cat: { tr "\n" "+" | sed 's/+$/\n/'| bc; } < numbers2.txt বা <numbers2.txt tr "\n" "+" | sed 's/+$/\n/'| bc
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

tr "\n" "+" <file | sed 's/+$/\n/' | bc
ghostdog74

0

এখানে আরও একটি:

open(FIL, "a.txt");

my $sum = 0;
foreach( <FIL> ) {chomp; $sum += $_;}

close(FIL);

print "Sum = $sum\n";

0

এটি আলাকান - আলাসকল ডাটাবেসের জন্য কমান্ড-লাইন ইউটিলিটি দিয়ে করতে পারেন ।

এটি নোড.জেএস এর সাথে কাজ করে, সুতরাং আপনাকে নোড.জেএস এবং তারপরে আলাসকল প্যাকেজ ইনস্টল করতে হবে :

TXT ফাইল থেকে যোগফল গণনা করতে আপনি নিম্নলিখিত কমান্ডটি ব্যবহার করতে পারেন:

> node alacon "SELECT VALUE SUM([0]) FROM TXT('mydata.txt')"

0

সমস্ত নতুন লাইন দ্বারা প্রতিস্থাপন করা +, 0এটি যুক্ত করে Rubyদোভাষীর কাছে প্রেরণ করা সহজ নয় ?

(sed -e "s/$/+/" file; echo 0)|irb

আপনার যদি না থাকে তবে আপনি irbএটিতে পাঠাতে পারেন bc, তবে আপনাকে শেষের (এর echo) ব্যতীত সমস্ত নতুন লাইন সরিয়ে ফেলতে হবে । এটির জন্য ব্যবহার করা ভাল tr, যদি আপনার পিএইচডি না থাকে sed

(sed -e "s/$/+/" file|tr -d "\n"; echo 0)|bc

0

যান:

package main

import (
    "bufio"
    "fmt"
    "os"
    "strconv"
)

func main() {
    scanner := bufio.NewScanner(os.Stdin)
    sum := int64(0)
    for scanner.Scan() {
        v, err := strconv.ParseInt(scanner.Text(), 10, 64)
        if err != nil {
            fmt.Fprintf(os.Stderr, "Not an integer: '%s'\n", scanner.Text())
            os.Exit(1)
        }
        sum += v
    }
    fmt.Println(sum)
}

"64" কি? "10" আমি মনে করি বেস?
পিটার কে

হ্যাঁ, 10 বেস। 64 হ'ল বিটের সংখ্যা, যদি ফলাফলটি সংখ্যক বিটগুলির সাথে প্রতিনিধিত্ব না করা যায় তবে একটি ত্রুটি ফিরে আসে। দেখুন golang.org/pkg/strconv/#ParseInt
dwurf

0

বাশ বৈকল্পিক

raw=$(cat file)
echo $(( ${raw//$'\n'/+} ))

$ wc -l file
10000 file

$ time ./test
323390

real    0m3,096s
user    0m3,095s
sys     0m0,000s

0

খোল ব্যবহার করে শেল-এ, আমি এটি করতে নীচে স্ক্রিপ্ট ব্যবহার করেছি:

    #!/bin/bash


total=0;

for i in $( awk '{ print $1; }' <myfile> )
do
 total=$(echo $total+$i | bc )
 ((count++))
done
echo "scale=2; $total " | bc
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.