আমি কীভাবে দুটি কলাম থেকে মানগুলি একত্রিত করতে পারি?


11

নিম্নলিখিত ফর্ম্যাটটিতে আমার একটি ফাইল রয়েছে:

$ cat /tmp/raw
2015-01   5000   1000
2015-02   6000   2000
2015-03   7000   3000

এখন, আমি যা চাই তা হ'ল প্রতিটি সারিতে 2 এবং 3 কলাম থেকে সম্মিলিত মান পেতে যাতে ফলাফলগুলি নীচে থাকে:

2015-01   6000
2015-02   8000
2015-03   9000

আমি এটি চেষ্টা করেছিলাম তবে এটি কেবল 2015-03 মানের মতো ফাইলে সর্বশেষ মানটি দেখায়।

উত্তর:


11

আপনি ব্যবহার করে দেখতে পারেন awk:

awk '{ print $1, $2 + $3; }' /tmp/raw

ফলাফলটি হবে (আমি মনে করি 2015-03 এর মান 10000 হওয়া উচিত):

2015-01 6000
2015-02 8000
2015-03 10000

1
আমি এই দ্রুত উত্তরটি পেয়েছি বিশ্বাস করতে পারি না: ও, আমি অন্য কোনও ফোরামে এরকম দ্রুত উত্তর পাই না :) কমান্ডটি পুরোপুরি কাজ করেছে বলে আপনাকে ধন্যবাদ :)
সৈয়দ জাহানজাইব

@ সৈয়দজাহানজাইব, যদি এই উত্তরটি আপনার সমস্যার সমাধান করে, দয়া করে কিছুক্ষণ সময় নিয়ে যান এবং বাম দিকে চেক চিহ্নটি ক্লিক করে এটি গ্রহণ করুন। এটি প্রশ্নটিকে উত্তর হিসাবে চিহ্নিত করবে এবং স্ট্যাক এক্সচেঞ্জের সাইটগুলিতে ধন্যবাদ প্রকাশ করার উপায়।
টেরডন

দুঃখিত আমি উত্তরটি চিহ্নিত করতে ভুলে গেছি এবং অন্যান্য
সকলকেও

@ সৈয়দ জাহানজাইব, যদিও আমি এই উত্তরের জন্য খুব ভাল ব্যাজ অর্জন করেছি, আমি টেরডনের উত্তরটিকে আরও সুনির্দিষ্ট এবং বিস্তৃত মনে করি।
টালিজিন

16

এখানে কয়েকটি উপায় রয়েছে:

  1. অন্য একটি অবাক পদ্ধতির

    awk '{$2+=$3;}NF--' file
    
  2. পার্ল

    perl -lane 'print "$F[0] ",$F[1]+$F[2]' file
    

    অথবা

    perl -ape 's/$F[1].*/$F[1]+$F[2]/e' file
    
  3. শেল (উপরের তুলনায় অনেক ধীর / কম দক্ষ)

    while read a b c; do echo "$a $((b + c))"; done < file
    

2
$2+=$3আরও বিশ্রী হতে পারে।
123

@ User112638726 আসলে এটি। ধন্যবাদ।
টেরডন

3
আপনি এমনকি ব্যবহার করতে পারেন awk '{$2+=$3}NF--'তাই এখনও ফাঁকা ক্ষেত্র 3 নেই। যদিও এটি আমার পছন্দটিকেই পছন্দ করে, এবং এটি নিজস্বভাবে উত্তর হিসাবে পোস্টের সাথেও সমান :)
123

1
@ User112638726 এখন এটি আমার কাছে ঘটেনি। অনেক সুন্দর, ধন্যবাদ!
টেরডন

আমি লিখেছি এই আপনার জন্য। নোট কিভাবে না শুধুমাত্র নেই sedএকরকম বুঝতে পরিচালনা ক্ষেত্র - এমনকি সংজ্ঞায়িত করতে ক্ষেত্রের মাছি, এবং ক্ষেত্র মধ্যে W / ক্ষেত্র - কিন্তু, যেমন দৃশ্যত ক্ষেত্রে দেখা যায়, ইউনিক্স regexp ম্যাচিং সমগ্র ধারণা আসলে মধ্যে একটি স্ট্রিং বিভাজক উপর ভিত্তি করে ক্ষেত্র একটি প্যাটার্ন অনুসারে ! কে জানত?
মাইক্রজারভ

5
sed 's/[^ ]* */[&]P/;s//&+pc/3'|dc

... কপি করে প্রিন্ট ...

2015-01   6000
2015-02   8000
2015-03   10000

সুতরাং উপরে আমি একজন ডিক্লেয়ার নিয়মিত প্রকাশ যা সংজ্ঞায়িত ক্ষেত্র-ব্যাপ্তি করে একটি নিয়ে গঠিত *পরিবর্তনশীল দৈর্ঘ্যের অক্ষর যা হয় একক ক্রম ^না <স্পেস> অবিলম্বে দ্বারা অনুসরণ *পরিবর্তনশীল দৈর্ঘ্যের অক্ষর যা হয় একক ক্রম <স্পেস> । এই ঘোষণা বিরুদ্ধে প্রয়োগ করা হয় sedএর প্যাটার্ন স্থান রয়েছে যা একটি স্ট্রিং সীমায়িত নয় (ডিফল্ট অনুসারে) প্রতিটি দ্বারা \newline চরিত্র যা ইনপুট ঘটে, এবং যা যাও recursively প্রতিস্থাপিত হয় (ডিফল্ট অনুসারে) একই প্রতিটি সংঘটন জন্য পরবর্তী সঙ্গে।

এই ঘোষণার জন্য ইন্টারফেসটি দ্বিগুণ, এবং প্রতিটি স্তরে কমপক্ষে একটি আন্তর্জাতিক আইইইই অফিসিয়াল স্ট্যান্ডার্ড কমিটি দ্বারা সম্পূর্ণ নিয়ন্ত্রিত এবং নির্দিষ্ট করা হয়েছে যাতে sedকমান্ড সিনট্যাক্সের পূর্বাভাসযোগ্য প্রয়োগ নিশ্চিত করতে পারে । উদাহরণস্বরূপ, sedএর এপিআই সিনট্যাক্স এ ক্ষেত্রে /অ্যাড্রেস /কমান্ডের সাথে প্রয়োগ করা হয় (যা সর্বদা কোনও sed s///যৌগ কমান্ডের প্রথম উপাদান ) তবে এর বিষয়বস্তুগুলি আরও একটি বেসিক এপিআই দ্বারা এটির জন্য নির্দিষ্ট করা সাবসেট হিসাবে ব্যাখ্যা করা হয় স্ট্যান্ডার্ড সি লাইব্রেরিতেregcomp() ফাংশন ।

আমি এই বিবৃতি অসংশয়ে করতে পারেন, কারণ sedহয় না নিছক একটি প্রোগ্রাম, কিন্তু বরং এক্সিকিউটেবল নামে সংকলিত sedআমার ইউনিক্সের মত মেশিন একটি হল বাস্তবায়ন ভালভাবে সংজ্ঞায়িত ঐতিহাসিকভাবে প্রতিষ্ঠিত, এবং মান নিয়ন্ত্রিত sed আবেদন আমার সিস্টেমের regular- এর এক্সপ্রেশন ম্যাচ লাইব্রেরি।


sedঅনুমান থেকে :

sedউপযোগ BREs বর্ণিত সহায়তা প্রদান করিবে XBD বেসিক রেগুলার এক্সপ্রেশন ...

... যেখানে আমরা ...

উভয় BREs এবং Eres অধীনে POSIX.1-2008 সিস্টেম ইন্টারফেস আয়তনের রেগুলার এক্সপ্রেশন ম্যাচিং ইন্টারফেস দ্বারা সমর্থিত regcomp(), regexec()এবং এর সাথে সম্পর্কিত ফাংশন।

একটি অ্যাপ্লিকেশন যা কল করে regcomp()এটি একটি প্যাটার্ন স্ট্রিং উপস্থাপন করবে এবং ...

... [টি] তিনি regcomp()ফাংশনটি প্যাটার্ন আর্গুমেন্ট দ্বারা নির্দেশিত স্ট্রিংয়ে থাকা নিয়মিত প্রকাশটি সংকলন করবেন এবং ফলাফলটি কাঠামোর পূর্ববর্তী স্থানে রাখবেন ...

এটিতে কাজ করার জন্য, অ্যাপ্লিকেশনটি তার regcomp()সহকর্মী ফাংশনটিকে নির্দেশ করবে ...

... [টি] তিনি regexec()ফাংশনটি পূর্ববর্তী কল দ্বারা সূচিত সংকলিত নিয়মিত অভিব্যক্তি প্রেগের সাথে স্ট্রিং দ্বারা নির্দিষ্ট নাল-টার্মিনেটেড স্ট্রিংটির সাথে তুলনা করেregcomp() ...

... regexec()এর সাবস্ট্রিং এর অফসেট সঙ্গে [একটি] অ্যারের উপাদানের মধ্যে দ্বারা একযোগে ভর্তি করব স্ট্রিং যে মিলা \(আলাদা subexpressions \)এর প্যাটার্ন ... প্যাটার্ন নিজেই একটি subexpression যেমন বড়, মোট ছাত্র ...

... [T] তিনি regexec()কাজ সব পূরণ করতে হবে nmatch উপাদান pmatch , যেখানে nmatch এবং pmatch অ্যাপ্লিকেশন দ্বারা সরবরাহ করা হয়, এমনকি যদি এর কিছু কিছু উপাদান pmatch মধ্যে subexpressions মিলা না প্যাটার্ন


এবং তাই যখন আমি ...

/[^ ]* */

... sedপ্রথমে নিয়মিত অভিব্যক্তি সংকলন করে ফলাফলগুলিকে মেমোরিতে সংরক্ষণ করে, তারপরে আমার কমান্ডটি পূরণের জন্য যতবার প্রয়োজন ততবার আমার প্যাটার্ন-স্পেসের বিষয়বস্তুগুলিতে সঞ্চিত সংকলিত-অটোমেটন প্রয়োগ করে। প্রতিবার এটি ফলাফলটি হ'ল এক বা একাধিক নাল-সীমাবদ্ধ ক্ষেত্রগুলির অ্যারে হিসাবে অফসেটগুলিতে ডিলিট হিসাবে দেওয়া regexec()

এবং আমি যখন ...

//

... ইঙ্গিত করার জন্য যে সর্বাধিক সংজ্ঞায়িত নিয়মিত অভিব্যক্তিটি ব্যবহার করা উচিত, sedকেবলমাত্র regexec()পূর্বনির্ধারিত নিয়মিত অভিব্যক্তিটি পুনরায় ব্যবহার করে আবার কল করতে পারে, তবে সম্ভবত এটি পরিবর্তিত স্ট্রিং আর্গুমেন্টে প্রয়োগ করতে হবে বা আমার আদেশ অনুসারে নতুন নামফল প্যারামিটার প্রয়োগ করতে হবে।

আরও নির্দিষ্টভাবে এখনও ...

  • s/[^ ]* */[&]P/
    • প্রথম সংঘটন প্রতিস্থাপন প্যাটার্ন একটি সঙ্গে প্যাটার্ন-স্পেস মধ্যে [বাম-স্কয়ার বন্ধনী, তারপর &নিজেই, তারপর ]ডান-স্কয়ার বন্ধনী একটি দ্বারা অনুসরণ Pঅক্ষর।
  • s//&+pc/3
    • বর্তমান ব্যবহৃত প্যাটার্ন স্পেসে আবার সর্বশেষ ব্যবহৃত নিয়মিত এক্সপ্রেশন প্রয়োগ করুন এবং প্যাটার্নের3 তৃতীয় ঘটনাকে প্যাটার্ন স্পেসে নিজের সাথে সংযুক্ত স্ট্রিং দ্বারা প্রতিস্থাপন করুন ।&+pc

এবং সুতরাং প্রতিটি sedইনপুট প্রতিটি লাইন জন্য এটি তার স্টাডাউট লিখুন, আপনার উদাহরণ ডেটা দেওয়া:

[2015-01   ]P5000   1000+pc
[2015-02   ]P6000   2000+pc
[2015-03   ]P7000   3000+pc

এটি দেখতে দেখতে অদ্ভুত dcলাগবে , তবে ক্যালকুলেটরটি বর্গাকার বন্ধনীগুলির মধ্যে তার ইনপুটগুলিতে স্ট্রিংয়ের উদ্ধৃতি দেয় এবং Pকমান্ড উভয়ই একটি \newline সংযুক্ত না করে স্ট্যাকের শীর্ষটি এবং পরে পপটিকে ইনপুট স্ট্যাকের বাইরে মুদ্রণ করবে ।

এবং সুতরাং, উদাহরণ হিসাবে প্রথম লাইনটি ব্যবহার করে, এটি dcকরবে:

  • [2015-01 ]P
    • Pখাঁজ এবং স্ট্যাক শীর্ষ পপ
  • 5000
    • 5000স্ট্যাকের শীর্ষে নম্বরটি চাপুন এবং বর্তমানে স্ট্যাকের সমস্ত উপাদানকে (বর্তমানে কোনও নয়) একে একে নীচে ঠেকান ।
  • 1000
    • তবুও, তবে এবার মূল স্ট্যাকের শীর্ষে 5000 নম্বরটি একে একে নীচে ঠেলে দেওয়া হবে এবং স্ট্যাকের দ্বিতীয় উপাদান হয়ে উঠবে।
  • +
    • একসাথে স্ট্যাকের শীর্ষ দুটি নম্বর যুক্ত করুন, স্ট্যাকের বাইরে থাকা উভয়কেই পপ করুন এবং স্ট্যাকের শীর্ষে যোগফলটি চাপুন।
    • এটি কেবল সংখ্যার সমন্বয়ে একটি স্ট্যাকের ফলস্বরূপ 6000
    • স্ট্যাকের শীর্ষ দুটি উপাদানগুলির মধ্যে একটি যদি [স্ট্রিং হয় তবে এটি একটি বাক্য গঠন ত্রুটি ]
  • p
    • pস্ট্যাকের \nশীর্ষটি ছড়িয়ে দিন এবং তার পরে স্ট্যাকের বাইরে থেকে পপিং না করে একটি সংযুক্ত ইওলাইন থাকে।
  • c
    • cস্ট্যাক শিখুন

আমি বিশ্বাস করি এটি কার্যকর হয়, তবে আমি এটি পার্স করতে পারি না। সামগ্রিকভাবে, আপনি ডিসির জন্য একটি সংযোজন সেট আপ করছেন। প্রথম প্যাটার্নটি বোঝায়। আমি মনে করি এটি তারিখের সাথে এবং পিছনের ফাঁকা সাথে মেলে তবে অক্ষর শ্রেণীর বন্ধনীগুলির মধ্যে যা আছে তা আমি পাই না ([&])। আপনি যদি এটিকে বানান করেন তবে দুর্দান্ত হবে।
জো

1
@ জো - আরও ভাল?
মাইকজারভেজ

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

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