আমি কোনও ফাইলের লাইনে সংখ্যার যোগফল কীভাবে করব


24

আমার কাছে এমন একটি ফাইল রয়েছে যা দেখতে এরকম দেখাচ্ছে:

1
3
4
1
4
3
1
2

আমি এর মোটটি কীভাবে খুঁজে পাব (অর্থাত্ 1 + 3 + 4 + 1 + 4 + 3 + 1 + 2 = 19)?


1
প্রসঙ্গে, স্ট্যাক এক্সচেঞ্জ এপিআই থেকে উবুন্টুকে জিজ্ঞাসা করে আমি যে ব্যাজগুলি পেয়েছি তা গণনা করছি।
টিম

সাথেcat badges.json | grep -o '"award_count":[0-9],"rank":"gold"' | grep -o [0-9]
টিম

যদিও আমি এখন বুঝতে পারি API এর একটি badge_countপদ্ধতি রয়েছে।
টিম

আপনি যদি এপিআই থেকে ব্যাজগুলি গণনা করছেন তবে আপনি যে ভাষাটি API টি জিজ্ঞাসা করতে ব্যবহার করছেন তা এটি (অজগর, জাভাস্ক্রিপ্ট) করতে পারে না?
ব্রায়াম

উত্তর:


42

bcবিভাজক হিসাবে pasteএকক এক মধ্যে লাইন পেতে সামান্য সাহায্যে +:

paste -sd+ file.txt | bc

grepস্থির ফাইলের পরিবর্তে (বা অন্য কোনও কমান্ড) আউটপুট ব্যবহার grepকরতে, এর STDOUT এর STDIN এ পাস করুন paste:

grep .... | paste -sd+ | bc

উদাহরণ:

% cat file.txt            
1
3
4
1
4
3
1
2

% paste -sd+ file.txt | bc
19

% grep . file.txt | paste -sd+ | bc
19

যদি আপনার অবশ্যই ব্যবহার করা হয় bashতবে আপনি ফাইলের বিষয়বস্তুগুলি সংরক্ষণ করতে একটি অ্যারে ব্যবহার করতে পারেন এবং তারপরে উপাদানগুলির উপর পুনরাবৃত্তি করতে পারেন বা আপনি লাইন দ্বারা ফাইল লাইনটি পড়তে পারেন এবং প্রতিটি লাইনের জন্য যোগফল করতে পারেন, দ্বিতীয় পদ্ধতিটি আরও কার্যকর হবে:

$ time { nums=$(<file.txt); for i in ${nums[@]}; do (( sum+=i )); done; echo $sum ;}
19

real    0m0.002s
user    0m0.000s
sys 0m0.000s

$ time { while read i; do (( sum+=i )); done <file.txt; echo $sum ;}
19

real    0m0.000s
user    0m0.000s
sys 0m0.000s

হুমম সুন্দর. প্রশ্নটি পরিবর্তনের জন্য দুঃখিত: গ্রিপ আউটপুট গ্রহণ করার জন্য আমি কি এটি সংশোধন করতে পারি (বা এটি একটি লাইনের মতো করতে পারি cat file.txt | bc?
টিম

@ টিম আমার সম্পাদনাগুলি পরীক্ষা করুন
হিমাইল

তা, সহজ ছিল!
টিম

2
আমার ব্যবহারের যে অন্য উত্তরটি আবিষ্কার না করে অবধি স্টিডিনটি আমার পক্ষে কাজ করে না paste -sd+ -। দয়া করে এটি সংশোধন করুন।
জেরুস

19

আপনিও জাজক ব্যবহার করতে পারেন। "হ্যালো" শব্দটি ধারণ করে * .txt ফাইলগুলিতে মোট রেখার সংখ্যা গণনা করতে :

grep -ch 'hello' *.txt | awk '{n += $1}; END{print n}'

একটি ফাইলের মধ্যে কেবল সংখ্যার যোগফল দিতে:

awk '{n += $1}; END{print n}' file.txt

তবে যদি সেই রেখার মান "4" থাকে তবে এটি 4 হিসাবে গণনা করবে না। এটি 1 গণনা করবে
টিম

না, এটি গণনা করবে 4
CrazyApe84

আমি একটি ফাইলের মোট সংখ্যা চাই। এটি কি তা করে?
টিম

আমি ভেবেছিলাম আপনি আপনার প্রশ্নটি গ্রেপের আউটপুটে পরিবর্তন করেছেন। আমি কিছু অনুমান করা ছিল। আমি কীভাবে একটি ফাইলের মানগুলি যোগ করতে পারি তা যুক্ত করব।
CrazyApe84

2
হ্যাঁ। এটি হিমাইলের মতোই একই উত্তর, তবে পেস্ট এবং বিসি পরিবর্তে এটি বিশ্রী ব্যবহার করে, যা শেষ পর্যন্ত অনেক বেশি নমনীয়তা দেয়। তবুও, তার উত্তর ভাল এবং তিনিই প্রথম ছিলেন তাই তিনি আপনার ভোটের দাবিদার!
CrazyApe84

7

numsumপ্যাকেজ থেকে ব্যবহার করুন num-utils!

(আপনার প্রয়োজন হতে পারে sudo apt-get install num-utils)

কমান্ডটি numsumডিফল্টরূপে আপনার যা প্রয়োজন ঠিক তা করে;

$ numsum file.txt 
19

পরীক্ষার নম্বরগুলি লাইন দিয়ে লাইনে পড়া stdin:

$ printf '
1 
3
4
1
4
3
1
2' | numsum
19

বা এক লাইন থেকে পড়া:

$ printf '1 3 4 1 4 3 1 2' | numsum -r
19


আরও ইউটিলিটি

প্যাকেজটিতে নম্বর প্রসেসিংয়ের জন্য আরও কিছু ইউটিলিটি রয়েছে যা আরও সুপরিচিত হওয়ার দাবি রাখে:

numaverage   - find the average of the numbers, or the mode or median
numbound     - find minimum of maximum of all lines
numgrep      - to find numbers matching ranges or sets
numinterval  - roughly like the first derivative
numnormalize - normalize numbers to an interval, like 0-1
numrandom    - random numbers from ranges or sets, eg odd.  
numrange     - similar to seq
numround     - round numbers up, down or to nearest

এবং আরও সাধারণ ক্যালকুলেটর কমান্ড numprocess,
যা কমান্ড লাইন থেকে ইনপুট লাইনের সংখ্যায় একটি এক্সপ্রেশন প্রয়োগ করে।


1

আপনি ব্যবহার করতে পারেন awk, একটি দেশীয় লিনাক্স অ্যাপ্লিকেশনটি প্রতি লাইনে একটি প্যাটার্ন দিয়ে ফাইলগুলি স্ক্যান করতে এবং প্রক্রিয়াজাত করতে ব্যবহারযোগ্য । আপনার প্রশ্নের জন্য, এটি আপনি যা চান তা উত্পাদন করবে:

awk 'BEGIN { sum=0 } { sum+=$1 } END {print sum }' file.txt

পাইপগুলিও গ্রহণযোগ্য:

cat file.txt | awk 'BEGIN { sum=0 } { sum+=$1 } END {print sum }'

BEGIN{}ব্লকের দরকার নেই , ক্রেজিএপি 84 এর উত্তর দেখুন
টেরডন

এটি এই সমস্যার কাছে অপ্রয়োজনীয় তবে আমি একটি যুক্তিযুক্ত কারণে এটি যুক্ত করা পছন্দ করেছি।
গওরাহ

তবে এটি কী শিক্ষা দেয়? এটি প্রতিটি সমস্যার কাছে অপ্রয়োজনীয়, awkসি নয়, এটি ব্যবহারের আগে আপনার কোনও ভেরিয়েবল সেট করার দরকার নেই। ব্যবহার করে দেখুন awk 'BEGIN{print c+=1}'
টেরডন

BEGIN {}ব্লকটি কেবল ভেরিয়েবলগুলি আরম্ভ করার জন্য তৈরি করা হয়নি। এটি ডিজাইনের স্পেসিফিকেশনে অংশ নেয়। সুতরাং, কিছু সমস্যা এটি প্রয়োজন হতে পারে।
গওরাহ

0

এটি bashস্ক্রিপ্টিংয়ের মোটামুটি সহজ ব্যবহার ।

SUM=0; for line in `cat file.txt`; do SUM=$((SUM + line)); done

এটি বর্তমান সলিউশনের তুলনায় অনেক সহজ এবং সরঞ্জামসামান্য।
Det

0

পার্ল সমাধান:

$ perl -lnae '$c+=$_;END{print $c}' input.txt                                                                            
19

উপরেরগুলি একাধিক ফাইল জুড়ে সমস্ত সংখ্যার যোগ করতে পারে:

$ perl -lnae '$c+=$_;END{print $c}' input.txt input2.txt                                                                 
34

কমান্ড-লাইনে একাধিক ফাইলের জন্য যেখানে আমরা পৃথক ফাইলে সংখ্যার যোগ দেখতে চাই আমরা এটি করতে পারি:

$ perl -lnae '$c+=$_;if(eof){printf("%d %s\n",$c,$ARGV);$c=0}' input.txt input2.txt                                      
19 input.txt
15 input2.txt


0

আপনার শেলের একটি অন্তর্নির্মিত বৈশিষ্ট্যটি ব্যবহার করা একটি সহজ পদ্ধতির উপায়:

SUM=0; while read N; do SUM=$((SUM+N)); done </path/to/file
echo $SUM

এটি আপনার ফাইলটি লাইনওয়াইজ করে পড়বে, ফলাফলের অঙ্কগুলি আপ করবে এবং মুদ্রণ করবে।

আপনি যদি কোনও পাইপ ব্যবহার করতে চান এবং কেবল প্রথম সারিটি ব্যবহার করতে চান তবে এটি এটির মতো কাজ করে:

SUM=0
your_command | while read -r LINE; do for N in $LINE; do break; done; SUM=$((SUM+N)); done
echo $SUM

প্রথম উপাদানটি পাওয়া এইভাবে করা হয়:

LIST="foo bar baz"
for OBJ in $LIST; do break; done
echo $OBJ

foo
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.