একটি গ্রেপের ফলাফল থেকে সংখ্যা যুক্ত করা


23

আমি নিম্নলিখিত আদেশটি চালাচ্ছি:

grep -o "[0-9] errors" verification_report_3.txt | awk '{print $1}'

এবং আমি নিম্নলিখিত ফলাফল পেতে:

1
4
0
8

আমি চলমান গণনা ভেরিয়েবলের প্রতিটি সংখ্যা যুক্ত করতে চাই। কেউ কি আমাকে তৈরি করতে সহায়তা করতে পারে এমন একটি যাদু আছে?

উত্তর:


32
grep -o "[0-9] errors" verification_report_3.txt | awk '{ SUM += $1} END { print SUM }'

এটি তালিকা মুদ্রণ করে না তবে সমষ্টিটি মুদ্রণ করে। আপনি যদি তালিকা এবং যোগফল উভয়ই চান তবে আপনি এটি করতে পারেন:

grep -o "[0-9] errors" verification_report_3.txt | awk '{ SUM += $1; print $1} END { print SUM }'

শান - আপনার উত্তরের জন্য আপনাকে ধন্যবাদ। আমি কীভাবে বাজে স্ক্রিপ্ট থেকে পুরোপুরি ফিরে যেতে পারি?
আমির আফগানি

2
@ আমির আপনি এটির মতো প্রথমটি ব্যবহার করবেন variable=$(grep -o "[0-9] errors" verification_report_3.txt | awk '{ SUM += $1} END { print SUM }')এটি কমান্ডের আউটপুট রাখবে (যা কেবলমাত্র যোগফলের মতো) নামক ভেরিয়েবলের নাম রাখেvariable
শন জে গোফ

3
@Amir আফগানী এছাড়াও, আপনি আপনার, grep পরিবর্তন করতে চাইতে পারেন "[0-9]\+ errors"। আপনার যদি লাইন প্রতিবেদন> 9 টি ত্রুটি থাকে তবে এটি মিলবে।
শন জে গফ

হ্যাঁ, বাহ আমি বিশ্বাস করতে পারি না যে আমি এটি মিস করেছি। ধন্যবাদ.
আমির আফগানি

শান, আউটপুটটি মনে হচ্ছে এটি আমার ফলাফলগুলি যোগ করছে না। দেখে মনে হচ্ছে: মোট ত্রুটিগুলি = + 259 + 7581 + 8852 + 2014 + 3189 ++ 13572 + 11438 +++ 6 + 4172 +
আমির আফগানি

8

এগুলিও পুরোপুরি বিশ্রীভাবে করা যায়:

awk '"[0-9]+ errors" {sum += $1}; END {print sum}' verification_report_3.txt

6

আপনি জিএনইউ সিস্টেমটি ব্যবহার করছেন বলে মনে হয় , সুতরাং পার্ল নিয়মিত এক্সপ্রেশন সমর্থন উপলব্ধ থাকলে আপনি এই জাতীয় কিছু লিখতে পারেন:

grep -Po '[0-9]+(?=\s+errors)' infile | 
  paste -sd+ | 
    bc

PS আমি সংখ্যাগুলিকে> 9 এর অনুমতি দেওয়ার জন্য নিয়মিত এক্সপ্রেশনটি (+ কোয়ান্টিফায়ার যুক্ত) সংশোধন করেছি।

PS বিকল্পভাবে, awk যথেষ্ট ( জিএনইউ অ্যাজকে ধরে নিলে ):

awk 'END { print s }
/[0-9]+[[:space:]]+errors/ { 
  s += $1 
  }' infile

আমার জন্য প্রথমটি ইতিমধ্যে কী পাইপে প্রবেশ করেছে তা মুদ্রণ করে ...
জেরুস

3

আপনার গ্রেপ থেকে আউটপুটটি পাইপ করার চেষ্টা করুন

awk 'BEGIN {total=0;}{total+=$1;}END {print "Total: ",total}'

2

আমি এটি ব্যবহার:

$ echo $(cat file | sed 's/$/+/') 0 | bc

এটি বৃহত তালিকার পক্ষে কার্যকর নয় তবে আমার বেশিরভাগ ব্যবহারের ক্ষেত্রে এটি ঠিক আছে। আমি প্রক্রিয়াটি স্বয়ংক্রিয় করতে শেল ফাংশনটি সাধারণত ব্যবহার করি যাতে আমাকে কেবল একটি ফাইলের নাম সরবরাহ করতে হয়:

## cheezy summation
##   call from .bashrc
##
getsum () { echo $(cat $1 | sed 's/$/+/') 0 | bc; }
gethsum () { echo $(cat $1 | sed 's/[gG]/*1000M/' | sed 's/[mM]/*1000K/' | sed 's/[kK]/*1000/' | sed 's/$/+/') 0 | bc; }
gethexsum () { echo ibase=16 $(cat $1 | sed 's/$/+/') 0 | bc; }

আপনার ডেটা অন্য কোনও ফ্যাশনে সীমিত করা থাকলে আপনি সর্বদা নির্দিষ্ট উপাদান বিভাজক বা চরিত্র শ্রেণীর জন্য শেষ প্রান্তের মার্কারকে বিকল্প হিসাবে রাখতে পারেন।

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