मेरे पास एक फाइल है जो इस प्रकार है:
1
3
4
1
4
3
1
2
मैं इसका कुल (यानी 1 + 3 + 4 + 1 + 4 + 3 + 1 + 2 = 19) कैसे पा सकता हूँ?
cat badges.json | grep -o '"award_count":[0-9],"rank":"gold"' | grep -o [0-9]
badge_count
तरीका है।
मेरे पास एक फाइल है जो इस प्रकार है:
1
3
4
1
4
3
1
2
मैं इसका कुल (यानी 1 + 3 + 4 + 1 + 4 + 3 + 1 + 2 = 19) कैसे पा सकता हूँ?
cat badges.json | grep -o '"award_count":[0-9],"rank":"gold"' | grep -o [0-9]
badge_count
तरीका है।
जवाबों:
bc
विभाजक के रूप paste
में एक एकल में लाइनों को प्राप्त करने के लिए थोड़ी मदद से +
:
paste -sd+ file.txt | bc
grep
एक स्थिर फ़ाइल के बजाय (या किसी अन्य कमांड) के आउटपुट का उपयोग करने के लिए, इसके grep
STDOUT में से पास करें 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
?
paste -sd+ -
। कृपया इसमें संशोधन करें।
तुम भी awk का उपयोग कर सकते हैं। * .Txt फ़ाइलों में कुल पंक्तियों की गिनती करने के लिए "हैलो" शब्द शामिल हैं:
grep -ch 'hello' *.txt | awk '{n += $1}; END{print n}'
किसी फ़ाइल में संख्याओं का योग करने के लिए:
awk '{n += $1}; END{print n}' file.txt
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
,
जो इनपुट लाइन पर कमांड लाइन से संख्याओं पर एक अभिव्यक्ति लागू करता है।
आप 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{}
ब्लॉक के लिए कोई ज़रूरत नहीं है , CrazyApe84 का जवाब देखें ।
awk
है, सी नहीं है, आपको इसका उपयोग करने से पहले एक चर सेट करने की आवश्यकता नहीं है। कोशिश करो awk 'BEGIN{print c+=1}'
।
BEGIN {}
ब्लॉक को केवल वैरिएबल को इनिशियलाइज़ करने के लिए डिज़ाइन नहीं किया गया था। यह डिजाइन विनिर्देश पर भाग लेता है। तो, कुछ समस्याओं पर इसकी आवश्यकता हो सकती है।
यह bash
स्क्रिप्टिंग का एक काफी सरल उपयोग है ।
SUM=0; for line in `cat file.txt`; do SUM=$((SUM + line)); done
पर्ल समाधान:
$ 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
सरल -
awk '{total+=$1} END{print total}' file
संख्याओं को जोड़ता है और आपको कुल देता है।
एक सरल तरीका आपके शेल की अंतर्निहित सुविधा का उपयोग करना है:
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