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


16

প্রতিটি লাইনে একটি কলামে পাঠ্য এবং সংখ্যা থাকে। আমাকে প্রতিটি সারিতে সংখ্যার যোগফল গণনা করতে হবে। আমি এটা কিভাবে করবো? ধন্যবাদ

উদাহরণ.লগ রয়েছে:

time=31sec
time=192sec
time=18sec
time=543sec

উত্তরটি 784 হওয়া উচিত


আমি এই পদ্ধতিটি অজানা '{যোগ + = $ 1} চেষ্টা করেছি; সমাপ্তি {মুদ্রণের যোগফল example 'example.log তবে এটি কেবল লাইনের সংখ্যার জন্য
জ্যাক ২

2
স্ট্যাক ওভারফ্লোতে প্রায় একই প্রশ্ন রয়েছে : আমি কীভাবে দ্রুত কোনও ফাইলের সমস্ত সংখ্যার যোগ করতে পারি? । ক্রস-সাইট সদৃশ সময় থাকতে পারে?
ফেডরকিই

উত্তর:


18

যদি আপনার grepসমর্থন -oবিকল্প, আপনি চেষ্টা করতে পারেন:

$ grep -o '[[:digit:]]*' file | paste -sd+ - | bc
784

POSIXly:

$ printf %d\\n "$(( $(tr -cs 0-9 '[\n*]' <file | paste -sd+ -) ))"
784

16

জিএনইউর নতুন সংস্করণ (4.x) সহ awk:

awk 'BEGIN {FPAT="[0-9]+"}{s+=$1}END{print s}'

অন্যান্য awkচেষ্টা সহ:

awk -F '[a-z=]*' '{s+=$2}END{print s}'

4
আপনার খালি s+0যেখানে প্রয়োজন আছে sএটি খালি 0পরিবর্তে মুদ্রণ করবে ।
cuonglm

আমাকে এটি ব্যাখ্যা করুন। - sখালি থাকতে পারে যেখানে কেবল একটি ক্ষেত্রে আছে ; যদি ইনপুট ডেটাতে কোনও লাইন থাকে না (যেমন কোনও ইনপুট না থাকে তবে )। সেক্ষেত্রে দুটি আচরণ সম্ভব হয়; 1) কোনও ইনপুট => কোনও আউটপুট নয়, বা 2) সর্বদা কিছু আউটপুট, যদি কেবল 0 হয় তবে উভয়ই প্রয়োগ প্রসঙ্গে নির্ভর করে বুদ্ধিমান বিকল্প। +0বিকল্প 2 অ্যাড্রেসিং করা হয়)। বিকল্পের ঠিকানা 1) লিখতে আপনাকে বরং লিখতে হবে END {if(s) print s}। - অতএব এটি কোনও প্রশ্নের বিকল্প হিসাবে ধরে নেওয়া (কোনও তথ্যের এই কোণার ক্ষেত্রে) ধরে নেওয়া কোনও ধারণা রাখে না যতক্ষণ না এটি প্রশ্ন দ্বারা নির্দিষ্ট করে দেওয়া হয়।
জ্যানিস

10
awk -F= '{sum+=$2};END{print sum}'

2
আমরা দীর্ঘ ফর্ম উত্তর পছন্দ। এটি কীভাবে কাজ করে তা দয়া করে বিস্তারিত বলতে পারেন?
slm

2
@ এসএলএম, এই উত্তরটি এখানে অন্য উত্তরগুলির চেয়ে কম বা কম ভার্বোস নয় এবং এটি স্ব-বর্ণনামূলক। এটির মতো ইনপুট নিয়ে কাজ করার সুবিধাও রয়েছেtime=1.4e5sec
স্টাফেন চ্যাজেলাস

@ স্টাফেনচাজেলাস - সম্মত, তবে এটি একটি নতুন ব্যবহারকারী এবং আমরা ব্যবহারকারীদের একক লাইনের চেয়ে বেশি উত্তর সরবরাহ করতে উত্সাহিত করি। এটি কীভাবে কাজ করে তা ব্যাখ্যা করার জন্য একটি বিট টেক্সট এটি কেবল কোডের চেয়ে অনেক বেশি শক্তিশালী উত্তর করে তুলবে।
slm

4
@ এসএলএম, এটি অন্যতম সেরা উত্তর (প্রযুক্তিগত অবস্থান থেকে) সহ নতুন ব্যবহারকারী এবং তিনি দুটি ডাউনওয়েট এবং একটি নেতিবাচক মন্তব্য পেয়েছেন। খুব উষ্ণ অভ্যর্থনা নয়।
স্টাফেন চেজেলাস

1
@ টমফেনেক, পজিক সিনট্যাক্স অ্যাওডির জন্য প্রয়োজন যে সেই প্যাটার্ন / ক্রিয়াকলাপ আইটেমগুলি পৃথক করা উচিত ";" বা "নিউলাইন", যাতে আপনি অজানা বাস্তবায়ন পেতে পারেন যেখানে এটি ব্যতীত এটি ব্যর্থ হয় ";"।
স্টাফেন চেজেলাস

7

আরেকটি জিএনইউ awk:

awk -v RS='[0-9]+' '{n+=RT};END{print n}'

একটি perl:

perl -lne'$n+=$_ for/\d+/g}{print$n'

একটি পজিক্স একটি:

tr -cs 0-9 '[\n*]' | grep . | paste -sd + - | bc

6
sed 's/=/ /' file | awk '{ sum+=$2 } END { print sum}'

দুর্দান্ত উত্তর, তবে প্রয়োজন নেই sed:awk --field-separator = '{ sum+=$2 } END { print sum}' data.dat
ব্যবহারকারীর 1717828

@ ব্যবহারকারী 1717828: আপনার পরিবর্তে (খাটো এবং আরও সুসংগত!) -F'='ব্যবহার করা উচিত--field-separator =
অলিভিয়ার ডুলাক

অলিভিয়ারডুলাক, অদ্ভুত, আমার man awkএকমাত্র দেয় -F fsএবং--field-separator fs
ব্যবহারকারী 1717828

@ ব্যবহারকারী 1717828: -F'='বা করার -F '='দুটি উপায় -F fs(এফএস আপনার ক্ষেত্রে "=")। আমি সিঙ্গলকোটগুলি যুক্ত করেছিলাম যাতে এফএস সঠিকভাবে দেখা যায় এবং অজকের দ্বারা ব্যাখ্যা করা হয়, শেলটি নয় (উদাহরণস্বরূপ যদি fs 'হয়;' উদাহরণস্বরূপ)
অলিভিয়ার ডুলাক

4

আপনি এটি চেষ্টা করতে পারেন:

awk -F"[^0-9]+" '{ sum += $2 } END { print sum+0; }' file

4

প্রত্যেকেই দুর্দান্ত awkউত্তর পোস্ট করেছেন , যা আমি খুব পছন্দ করি।

এর পরিবর্তে @ কুংগলমে পরিবর্তিত grepহওয়া sed:

sed 's/[^0-9]//g' example.log | paste -sd'+' - | bc
  1. sedসংখ্যার জন্য ছাড়া সবকিছু রেখাচিত্রমালা।
  2. paste -sd+ -কমান্ড সব লাইন একসঙ্গে যোগদান করে একটি একক লাইন হিসেবে
  3. bcঅভিব্যক্তি মূল্যায়ণ

3

আপনার একটি ক্যালকুলেটর ব্যবহার করা উচিত।

{ tr = \ | xargs printf '[%s=]P%d+p' | dc; } <infile 2>/dev/null

আপনার চারটি লাইন যা মুদ্রণ করে:

time=31
time=223
time=241
time=784

এবং আরও সহজভাবে:

tr times=c '    + p' <infile |dc

... যা ছাপায় ...

31
223
241
784

আপনি dcযদি চান তার পরে যদি গতি হয় । Ditionতিহ্যগতভাবে এটি bcসংকলক ছিল - এবং এখনও অনেক সিস্টেমের জন্য।


আমার পরিমাপ অনুসারে নয় : সূত্রটি তৈরি করতে আপনার কতটা কাজ করতে হবে তা নির্ভর করে
গ্লেন জ্যাকম্যান

@glennjackman - আপনার পরিমাপগুলিতে dcআমি যতটা বলতে পারি তার কাছাকাছি অন্তর্ভুক্ত হয় না । আপনি কি বিষয়ে কথা হয়?
মাইকজার্ভ

যাইহোক, নতুন ক্রুদের সাথে পুরানো ক্রুদের তুলনা করার সময় - যেমন আপনি যখন perlমানক ইউনিক্স টুলসেটটি বেনমার্ক করেন - আপনি কোনও জিএনইউ সরঞ্জামচেইনে সংকলিত জিএনইউ সরঞ্জামগুলি ব্যবহার করেন তা সত্যিই ততটা অর্থপূর্ণ নয়। পার্লের পারফরম্যান্সকে নেতিবাচকভাবে প্রভাবিত করতে পারে এমন সমস্ত ফোটাগুলি জিএনইউ-সংকলিত জিএনইউ ব্যবহারগুলির মধ্যেও রয়েছে । দুঃখের হলেও সত্য. পার্থক্যটি সঠিকভাবে বিচার করার জন্য আপনার একটি বাস্তব, সহজভাবে নির্মিত, সহজ টুলসেটের দরকার। উদাহরণস্বরূপ, ম্যাসল লিবের বিরুদ্ধে স্টাটালি লিঙ্কযুক্ত উত্তরাধিকারী-সরঞ্জামচেষ্ট সংকলনের মতো - এইভাবে আপনি ওয়ান-সরঞ্জাম / এক-কাজের দৃষ্টান্ত বনাম এক-সরঞ্জাম-টু-রুল-ও-সমস্ত একটিতে বেঞ্চ করতে পারেন।
মাইকজার্ভ

3

অজগর 3 এর মাধ্যমে,

import re
with open(file) as f:
    m = f.read()
    l = re.findall(r'\d+', m)
    print(sum(map(int, l)))

re.findallস্ট্রিংগুলির একটি তালিকা ফিরিয়ে দেয়, এটি কার্যকর হবে না
ইরুভর

@ 1_CR ইয়ে, আমি এটি ভুলে গেছি। এখন দেখ.
অবিনাশ রাজ

হতে পারে sum(int(e) for e in l)আরও পাইথোনিক।
cuonglm

3

খাঁটি বাশ সমাধান (বাশ 3+):

while IFS= read -r line; do                   # While it reads a line:
    if [[ "$line" =~ [0-9]+ ]]; then      # If the line contains numbers:
        ((counter+=BASH_REMATCH[0]))          # Add the current number to counter
    fi                                    # End if.
done                                  # End loop.

echo "Total number: $counter"         # Print the number.
unset counter                         # Reset counter to 0.

সংক্ষিপ্ত সংস্করণ:

while IFS= read -r l; do [[ "$l" =~ [0-9]+ ]] && ((c+=BASH_REMATCH)); done; echo $c; c=0

1
সম্ভবত এটিও:PS4='$((x+=${time%s*}))' time=0 x=0 sh -x <infile
মাইকজার্ভ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.