ইউনিট প্রত্যয় সহ সংখ্যার জন্য পার্সিং?


10

ধরা যাক যে আপনার কাছে মানব-পঠনযোগ্য ফর্ম্যাটে পরিমাণের সাথে ডেটা রয়েছে যেমন আউটপুট du -h, এবং সেই সংখ্যাগুলিতে আরও কাজ করতে চান। ধরা যাক আপনি সেই ডেটার উপ-সেটের সংমিশ্রণ করতে আপনার গ্রেপের মাধ্যমে আপনার ডেটাটি পাইপ করতে চান। আপনি এমন অনেক সিস্টেমে এই বিজ্ঞাপনটি করেন যা আপনি আগে কখনও দেখেন নি এবং কেবলমাত্র ন্যূনতম উপযোগিতা রয়েছে। আপনি সমস্ত স্ট্যান্ডার্ড 10 ^ n প্রত্যয়ের জন্য প্রত্যয় রূপান্তর চান।

পাইপলাইনের মধ্যে প্রত্যয়যুক্ত সংখ্যাকে আসল সংখ্যায় রূপান্তর করতে একটি গ্নু-লিনাক্স ইউটিলিটি বিদ্যমান? এটি করার জন্য আপনার কি কোনও বাশ ফাংশন লেখা আছে, বা কিছু পারল যা মনে রাখা সহজ, লম্বা রেজেক্স প্রতিস্থাপন বা বেশ কয়েকটি সিড স্টেপের পরিবর্তে মনে রাখা সহজ?

38M     /var/crazyface/courses/200909-90147
2.7M    /var/crazyface/courses/200909-90157
1.1M    /var/crazyface/courses/200909-90159
385M    /var/crazyface/courses/200909-90161
1.3M    /var/crazyface/courses/200909-90169
376M    /var/crazyface/courses/200907-90171
8.0K    /var/crazyface/courses/200907-90173
668K    /var/crazyface/courses/200907-90175
564M    /var/crazyface/courses/200907-90178
4.0K    /var/crazyface/courses/200907-90179

| grep 200907 | <amazing suffix conversion> | awk '{s+=$1} END {print s}'


প্রাসঙ্গিক তথ্যসূত্র:


2
আপনার খুব কমই গ্রেপ এবং অ্যাজক ব্যবহার করা দরকার। আপনি যদি awk ব্যবহার করে থাকেন, তবে awk ব্যবহার করুন। /200907/আপনার প্রতি-লাইন কোডের সামনে কেবল যুক্ত করুন , উদাহরণস্বরূপawk '/200907/{s+=$1} END {print s}'
টনি

উত্তর:


14

আপনি যে প্রশ্নগুলির সাথে লিঙ্ক করেছেন তার একটিতে আমার উত্তরের ভিত্তিতে:

awk '{
    ex = index("KMGTPEZY", substr($1, length($1)))
    val = substr($1, 0, length($1) - 1)

    prod = val * 10^(ex * 3)

    sum += prod
}
END {print sum}'

আর একটি পদ্ধতি যা ব্যবহার করা হয়েছে:

sed 's/G/ * 1000 M/;s/M/ * 1000 K/;s/K/ * 1000/; s/$/ +\\/; $a0' | bc

দ্বিতীয় পদ্ধতির জন্য, প্রত্যয়টি হলে কী হবে?
djuarez

@ ডিজুয়ারেজ: এস কোন গুণকের পক্ষে দাঁড়ায়?
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

কিছুই নয়, অন্য ইউনিটের ক্ষেত্রে কেবল এক্সট্রাপোলটিং করা।
djuarez

@ ডিজুয়ারেজ: এর কোন মানে হয় না। এই উত্তরটি এসআই প্রত্যয় সম্পর্কে, সাধারণ ইউনিট নয় (সেকেন্ড, সম্ভবত?)। sedআমার উত্তরে কমান্ডটি প্রসারিত করতে , আপনি awkকমান্ডের মতোই অতিরিক্ত এসআই প্রত্যয়গুলি পরিচালনা করার জন্য ক্লজ যুক্ত করবেন cla s/T/ * 1000 G;শুরুতে যোগ করা উদাহরণস্বরূপ টেরাবাইট যুক্ত করবে।
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

3

এটি করার জন্য আপনি পার্ল নিয়মিত এক্সপ্রেশন ব্যবহার করতে পারেন। উদাহরণ স্বরূপ,

$value = 0;
if($line =~ /(\d+\.?\d*)(\D+)\s+/) {
   $amplifier = 1024 if ($2 eq 'K');
   $amplifier = 1024 * 1024 if ($2 eq 'M');
   $amplifier = 1024 * 1024 * 1024 if ($2 eq 'G');
   $value = $1 * $amplifier;
}

এটি একটি সাধারণ স্ক্রিপ্ট। আপনি এটি সূচনা পয়েন্ট হিসাবে বিবেচনা করতে পারেন। আশা করি এটি সাহায্য করবে!


আসলে, এটি একটি উপায় one আমি স্ট্যাকওভারফ্লো . com/ প্রশ্নগুলি / 2557649/… ও পেয়েছি ।
মটরশুটি

3

ব্যক্তিগতভাবে, আমি প্রথম স্থানে -h পতাকা ব্যবহার করব না। "মানব পঠনযোগ্য" সংস্করণটি গোলগুলি বন্ধ করে দেয় যা আপনি যখন আবার রূপান্তর করবেন তখন আরও কম নির্ভুল হয়ে উঠলে আবার গোল করা দরকার। (উদাহরণস্বরূপ, 2.7MiB হ'ল 2831155.2 বাইট। আপনি বাইটের অন্যান্য 0.8 তম কি করলেন ??!)

অন্যথায়, আপনি unitsএমআইবি / জিআইবি / কিবিকে কেবল "বি" তে রূপান্তর করতে বলতে পারেন এবং এটি এটি পরিচালনা করবে, তবে আপনাকে এমন কিছু করতে হবে (অনুমান করে আপনার আউটপুটটি ট্যাবড হয়েছে, অন্যথায় cutযথাযথভাবে)

{your output} | cut -f1 '-d{tab}' | xargs -L 1 -I {} units -1t {}iB B | awk '{s+=$1}END{printf "%d\n",s}'

ভালভাবে উল্লেখ করা হয়েছে যে নির্ভুলতার ক্ষতি আছে। ইউনিটগুলিতে ইনপুট পরিপূরক করাও কাজ করে .. তবে আমি unitsআমার ন্যূনতম ডিস্ট্রোতে নিখোঁজ পেয়েছি ! আমি মনে করি যদি আমাদের সমস্ত কিছুর সম্পূর্ণ নিয়ন্ত্রণ থাকে তবে আমরা সবাই এটি আলাদাভাবে করতাম।
মটরশুটি

2
VALUE=$1

for i in "g G m M k K"; do
        VALUE=${VALUE//[gG]/*1024m}
        VALUE=${VALUE//[mM]/*1024k}
        VALUE=${VALUE//[kK]/*1024}
done

[ ${VALUE//\*/} -gt 0 ] && echo VALUE=$((VALUE)) || echo "ERROR: size invalid, pls enter correct size"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.