shell - ণবর - স্বাভাবিক সংখ্যা কি কি




শেল কমান্ড পূর্ণসংখ্যা, প্রতি লাইন এক? (20)

আমি একটি কমান্ড খুঁজছি যা টেক্সটের ইনপুট একাধিক লাইন হিসাবে গ্রহণ করবে, প্রতিটি লাইনে একটি একক পূর্ণসংখ্যা থাকবে এবং এই পূর্ণসংখ্যার সমষ্টি আউটপুট হবে।

কিছুটা ব্যাকগ্রাউন্ড হিসাবে, আমার একটি লগ ফাইল রয়েছে যার মধ্যে টাইমিং পরিমাপ রয়েছে, তাই প্রাসঙ্গিক লাইনগুলির জন্য grepping এর মাধ্যমে এবং সামান্য সংস্কারের জন্য আমি সেই ফাইলে সমস্ত সময় তালিকাবদ্ধ করতে পারি। তবে আমি মোটামুটি কাজ করতে চাই, এবং আমার মন কোনও কমান্ডের মতো ফাঁকা হয়ে গেছে যেটি আমি এই মধ্যবর্তী আউটপুটটিকে চূড়ান্ত যোগ করার জন্য পাইপ করতে পারি। আমি সবসময় অতীতের expr ব্যবহৃত হয়েছে, কিন্তু এটি RPN mode রান না হওয়া পর্যন্ত আমি এটা মোকাবেলা যাচ্ছে না মনে হয় (এবং এমনকি তারপর এটি চতুর হবে)।

আমি কি অনুপস্থিত? এটি অর্জন করার বেশ কয়েকটি উপায় রয়েছে বলে দেওয়া হয়েছে, আমি যে কোনও পদ্ধতির কাজটি পড়তে (এবং upvote ) খুশি হব, এমনকি যদি অন্য কেউ ইতিমধ্যেই একটি ভিন্ন সমাধান পোস্ট করেছে যেটি কাজ করে।

সম্পর্কিত প্রশ্ন: ইউনিক্সের আউটপুট একটি কলামের সমষ্টি হিসাব করার সংক্ষিপ্ততম কমান্ড? (ক্রেডিট @Andrew )

আপডেট : বাহ, প্রত্যাশিত হিসাবে এখানে কিছু চমৎকার উত্তর আছে। মনে হচ্ছে আমি সাধারণভাবে একটি command-line tool হিসাবে গভীরভাবে পরিদর্শন দিতে হবে!


BASH সমাধান, যদি আপনি এটি একটি কমান্ড তৈরি করতে চান (উদাহরণস্বরূপ, আপনাকে এটি ঘন ঘন করতে হবে):

addnums () {
  local total=0
  while read val; do
    (( total += val ))
  done
  echo $total
}

তারপর ব্যবহার:

addnums < /tmp/nums

Python মধ্যে এক লাইনার সংস্করণ:

$ python -c "import sys; print(sum(int(l) for l in sys.stdin))"

আপনি num-utils ব্যবহার করতে পারেন, যদিও এটি আপনার প্রয়োজনের জন্য অতিরিক্ত হতে পারে। এটি শেলের সংখ্যাগুলি ম্যানিপুলিউটিংয়ের প্রোগ্রামগুলির একটি সেট এবং এটি অবশ্যই যুক্ত করে বেশ কয়েকটি নিফটি জিনিসগুলি করতে পারে। এটি একটি বিট তারিখের বাইরে, তবে তারা এখনও কাজ করে এবং আপনাকে আরও কিছু করার প্রয়োজন হলে দরকারী হতে পারে।

http://suso.suso.org/programs/num-utils/


আপনি আপনার পছন্দের 'expr' কমান্ডটি ব্যবহার করতে পারেন যা আপনাকে প্রথমে প্রথমে ইনপুট ফাইন্যাল করতে হবে:

seq 10 | tr '[\n]' '+' | sed -e 's/+/ + /g' -e's/ + $/\n/' | xargs expr

প্রক্রিয়াটি হল:

  • "tr" একটি + চিহ্ন সহ Eoln অক্ষর প্রতিস্থাপন করে,
  • সাইড প্যাড '+' প্রতিটি পাশে স্পেস দিয়ে, এবং তারপর চূড়ান্ত আঁকা + লাইন থেকে
  • xargs expr জন্য গ্র্যান্ড ইনপুট কমান্ড লাইন ইনপুট প্রবেশ করে।

আমার সংস্করণ:

seq -5 10 | xargs printf "- - %s" | xargs  | bc

আমি এটি একটি পুরানো প্রশ্ন উপলব্ধি, কিন্তু আমি এটা ভাগ করতে যথেষ্ট এই সমাধান পছন্দ।

% cat > numbers.txt
1 
2 
3 
4 
5
^D
% cat numbers.txt | perl -lpe '$c+=$_}{$_=$c'
15

যদি আগ্রহ থাকে, আমি কিভাবে এটি কাজ করে ব্যাখ্যা করব।


আমি মনে করি আপনি যা খুঁজছেন তা AWK হয়:

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

আপনি স্ট্যান্ডার্ড কমান্ডের মাধ্যমে নম্বরগুলি পাস করে অথবা পরামিতি হিসাবে সংখ্যার ধারণকারী ফাইলটি পাশ করে এই কমান্ডটি ব্যবহার করতে পারেন।


আমি সাধারণত অনুমোদিত সমাধান একটি বড় সতর্কতা করা হবে:

awk '{s+=$1} END {print s}' mydatafile # DO NOT USE THIS!!

যেহেতু এই ফর্মটিতে awk একটি 32 বিট স্বাক্ষরিত পূর্ণসংখ্যা উপস্থাপনা ব্যবহার করে: এটি 2147483647 (অর্থাত্, ২ ^ 31) অতিক্রম করে এমন অর্থের জন্য ওভারফ্লো হবে।

আরো সাধারণ উত্তর (সংখ্যার পূর্ণসংখ্যাগুলির জন্য) হবে:

awk '{s+=$1} END {printf "%.0f\n", s}' mydatafile # USE THIS INSTEAD

পিএস আমি প্রথম উত্তর মন্তব্য করতে পছন্দ হবে, কিন্তু আমার যথেষ্ট খ্যাতি নেই ..


নিম্নলিখিত কাজ করা উচিত (আপনার নম্বর অনুমান প্রতিটি লাইন দ্বিতীয় ক্ষেত্র)।

awk 'BEGIN {sum=0} \
 {sum=sum + $2} \
END {print "tot:", sum}' Yourinputfile.txt

নিম্নলিখিত ব্যাশ কাজ করে:

I=0

for N in `cat numbers.txt`
do
    I=`expr $I + $N`
done

echo $I

প্লেইন bash এক মাছ ধরার নৌকা

$ cat > /tmp/test
1 
2 
3 
4 
5
^D

$ echo $(( $(cat /tmp/test | tr "\n" "+" ) 0 ))

বিকল্প বিশুদ্ধ পার্ল, মোটামুটি পঠনযোগ্য, কোন প্যাকেজ বা বিকল্প প্রয়োজন:

perl -e "map {$x += $_} <> and print $x" < infile.txt

বিশুদ্ধ এবং সংক্ষিপ্ত bash।

f=$(cat numbers.txt)
echo $(( ${f//$'\n'/+} ))

যদি আপনি আরামদায়ক বোধ করেন তবে আপনি পাইথন এ এটি করতে পারেন:

পরীক্ষিত নয়, শুধু টাইপ করা হয়েছে:

out = open("filename").read();
lines = out.split('\n')
ints = map(int, lines)
s = sum(ints)
print s

Sebastian একটি এক মাছ ধরার নৌকা স্ক্রিপ্ট নির্দেশ:

cat filename | python -c"from fileinput import input; print sum(map(int, input()))"

রুবি প্রেমীদের জন্য

ruby -e "puts ARGF.map(&:to_i).inject(&:+)" numbers.txt

সামান্য ব্যাশ:

$ cat numbers.txt 
1
2
3
4
5
6
7
8
9
10
$ sum=0; while read num; do ((sum += num)); done < numbers.txt; echo $sum
55

সি ++ (সরলীকৃত):

echo {1..10} | scc 'WRL n+=$0; n'

SCC প্রকল্প - http://volnitsky.com/project/scc/

SCC C ++ স্নিপেটস শেল প্রম্পটে মূল্যায়নকারী


jq সঙ্গে:

seq 10 | jq -s 'add' # 'add' is equivalent to 'reduce .[] as $item (0; . + $item)'

perl -lne '$x += $_; END { print $x; }' < infile.txt

sed 's/^/.+/' infile | bc | tail -1




shell