অন্য কলামের মানের উপর ভিত্তি করে একটি কলামের মানগুলি যোগ করতে awk ব্যবহার করা


63

আমি ব্যবহার করে একটি কলামে নির্দিষ্ট নম্বর যোগ করার চেষ্টা করছি awk। আমি শুধু "কামারদের" কলাম 3 যোগফল পেতে 212 মোট আমি ব্যবহার পুরো কলাম যোগফল করতে চাই awkকিন্তু শুধুমাত্র "কামারদের"। আমার আছে:

awk 'BEGIN {FS = "|"} ; {sum+=$3} END {print sum}' filename.txt

এছাড়াও আমি পুট্টি ব্যবহার করছি। কোন সাহায্যের জন্য আপনাকে ধন্যবাদ।

smiths|Login|2
olivert|Login|10
denniss|Payroll|100
smiths|Time|200
smiths|Logout|10

উত্তর:


81
awk -F '|' '$1 ~ /smiths/ {sum += $3} END {print sum}' inputfilename
  • -Fপতাকা ক্ষেত্র বিভাজক সেট করে; আমি এটি একক উদ্ধৃতিতে রেখেছি কারণ এটি একটি বিশেষ শেল অক্ষর।
  • তারপরে $1 ~ /smiths/নিম্নলিখিত {কোড ব্লক} কেবলমাত্র সেই লাইনে প্রয়োগ করুন যেখানে প্রথম ক্ষেত্রটি রেজেক্সের সাথে মেলে /smiths/
  • বাকিটি আপনার কোডের মতো।

মনে রাখবেন যে আপনি যেহেতু এখানে সত্যিকার অর্থে একটি রেগেক্স ব্যবহার করছেন না, তাই আপনি কেবল সহজেই ব্যবহার করতে পারেন:

awk -F '|' '$1 == "smiths" {sum += $3} END {print sum}' inputfilename

যা স্ট্রিং সমতা পরীক্ষা করে। এটি /^smiths$/অন্য জবাব হিসাবে উল্লিখিত হিসাবে রেজেক্স ব্যবহারের সমতুল্য , যার মধ্যে ^অ্যাঙ্কর কেবল স্ট্রিংয়ের শুরু (ফিল্ড 1 এর সূচনা) এবং $কেবলমাত্র স্ট্রিংয়ের শেষের সাথে মিলে যাওয়ার জন্য অ্যাঙ্কর অন্তর্ভুক্ত করে। আপনি রেজিক্সগুলির সাথে কতটা পরিচিত তা নিশ্চিত নন। এগুলি খুব শক্তিশালী, তবে এই ক্ষেত্রে আপনি স্ট্রিং সমতা পরীক্ষা করতে পারেন ঠিক তত সহজে।


3
যাইহোক, আমার কাছে যেতে প্রিয় অ্যাডাব্লিক রেফারেন্সটি হ'ল grymoire.com/Unix/Awk.html । খুব সহায়ক পৃষ্ঠা।
ওয়াইল্ডকার্ড

1
ধন্যবাদ @ উইল্ডকার্ড! আপনার পরামর্শের উপর ভিত্তি করে বড় বড় জিপ সংরক্ষণাগারে নির্দিষ্ট ফাইলগুলির একটি সঙ্কুচিত আকারকে ঝাঁঝরা করে আমি সক্ষম করতে পেরেছিলাম :) unzip -lv /appl/tmp/data.lar | grep documentlibrary | awk '{sum += $1} END {print sum/1024/1024}'
পাওয়েল

15

আর একটি পদ্ধতি হ'ল বিভক্ত এসোসিয়েটিভ অ্যারেগুলি, আরও তথ্য এখানে । এই লাইনটি পছন্দসই আউটপুট উত্পাদন করে:

awk -F '|' '{a[$1] += $3} END{print a["smiths"]}' filename.txt

পার্শ্ব প্রতিক্রিয়া হিসাবে, অ্যারে অন্যান্য সমস্ত মান সংরক্ষণ করে:

awk -F '|' '{a[$1] += $3} END{for (i in a) print i, a[i]}' filename.txt

আউটপুট:

smiths 212
denniss 100
olivert 10

এটি সঠিক উত্তর
পোভা

5

এখন পর্যন্ত খুব ভাল। যোগফল যোগ করার জন্য আপনাকে যা করতে হবে তা হল ব্লকের আগে একটি নির্বাচক যুক্ত করা add এখানে আমরা পরীক্ষা করে দেখি যে প্রথম যুক্তিতে কেবল "স্মিথস" রয়েছে:

awk 'BEGIN {FS = "|"} ; $1 ~ /^smiths$/ {sum+=$3} END {print sum}'

ক্ষেত্র বিভাজককে বিকল্প হিসাবে নির্দিষ্ট করে আপনি এটি কিছুটা ছোট করতে পারেন। ইন awkসাধারণভাবে একটি ভাল ধারণা কমান্ড লাইন ভেরিয়েবল আরম্ভ আছে:

awk -F'|' '$1 ~ /^smiths$/ {sum+=$3} END {print sum}'

0
cat filename.txt | grep smiths | awk -F '|' '{sum+=$NF} END {print sum}'
  • -F বিভাজক নির্দিষ্ট করতে বিকল্প।
  • $NF "শেষ কলাম" এর জন্য।

1
catএবং grepএখানে অপ্রয়োজনীয়।
আন্দ্রে

গ্রেডকে কেন অ্যানড্রেড করা হয়েছে? ওপি কেবল "স্মিথস" সারি যুক্ত করতে চায়। আপনার কী ডাবলু বিবৃতিটি সংশোধন করা দরকার, তাই না?
EL

1
@ ইল হ্যাঁ, গ্রেপ কলটি না থাকলে অজগ বিবৃতিতে পরিবর্তন করা উচিত /smiths/{...}। এটি একটি তুচ্ছ পরিবর্তন, তবে এটি উল্লেখযোগ্য সুবিধা প্রদান করে: চলমান প্রক্রিয়াগুলির সংখ্যা হ্রাস করে, ত্রুটি নিয়ন্ত্রণকে সহজ করে তোলে এবং কোডটি আরও পরিষ্কার করে তোলে।
আন্দ্রে

0

আমি ব্যক্তিগতভাবে awkবিভাগটি যথাসম্ভব সরল রাখতে পছন্দ করি এবং এটি ব্যতীত আপনার যতটা সম্ভব করুন। একত্রিত যুক্তি ইউনিক্স পাইপলাইনগুলির শক্তির সুবিধা গ্রহণ করে না এবং এইভাবে ঘনিষ্ঠভাবে সম্পর্কিত ব্যবহারের ক্ষেত্রে বোঝার, ডিবাগ বা সংশোধন করা আরও শক্ত।

cat filename.txt | perl -pe 's{.*|}{}g' | awk '{sum+=$1} END {print sum}'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.