মিলের ক্ষেত্রের উপর ভিত্তি করে কলামগুলির যোগফল


11

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

2 1019 0 12 
2 1019 3 0 
2 1021 0 2 
2 1021 2 0 
2 1022 4 5
2 1030 0 1 
2 1030 5 0 
2 1031 4 4

কলাম 2- এর মানগুলি যদি মিলায় তবে আমি উভয় লাইনের কলাম 3 এবং 4-তে মানগুলি যোগ করতে চাইছি , অন্যথায় অনন্য লাইনের মানগুলির যোগফল the

সুতরাং আমি যে আউটপুটটির জন্য প্রত্যাশা করছি তা এর মতো দেখাবে:

2 1019 15 
2 1021 4 
2 1022 9 
2 1030 6 
2 1031 8

আমি অনুযায়ী ফাইল বাছাই করতে সক্ষম কলাম 2 সঙ্গে awkবা sortএবং গত কলাম যোগফল awk, কিন্তু শুধুমাত্র পৃথক লাইন জন্য দুই লাইন যেখানে না কলাম 2 ম্যাচ।


1
1 কলাম সম্পর্কে কি?
গ্লেন জ্যাকম্যান

@glennjackman: প্রতিটি ফাইল জুড়ে কলাম 1 এর সমান মূল্য রয়েছে। এটি ফাইলটির জন্য সনাক্তকারী হিসাবে কাজ করে (আমার মধ্যে 45 টি রয়েছে) এবং কিছু প্রবাহ প্রক্রিয়াতে ব্যবহৃত হবে। আমার প্রশ্নের জন্য এটি পাশাপাশি উপেক্ষা করা হবে (বা মুছে ফেলা) এবং পরে আবার যুক্ত করা যেতে পারে।
টমপিও

বা, $1 $2কী হিসাবে তৈরি করুন।
গ্লেন জ্যাকম্যান

উত্তর:


12

আমি পার্লে এটি করব:

$ perl -lane '$k{"$F[0] $F[1]"}+=$F[2]+$F[3]; 
              END{print "$_ $k{$_}" for keys(%k) }' file 
2 1019 15
2 1021 4
2 1030 6
2 1031 8
2 1022 9

বা অবাস্তব:

awk '{a[$1" "$2]+=$3+$4}END{for (i in a){print i,a[i]}}' file 

আপনি যদি দ্বিতীয় কলাম অনুসারে আউটপুটটি সাজানো চান তবে আপনি কেবল পাইপ করতে পারেন sort:

awk '{a[$1" "$2]+=$3+$4}END{for (i in a){print i,a[i]}}' file | sort -k2

নোট করুন যে উভয় সমাধানের মধ্যে 1 ম কলামটিও অন্তর্ভুক্ত রয়েছে। প্রথমটি এবং দ্বিতীয় কলামটি হ্যাশ (পার্লে) বা কোনও এসোসিয়েটিভ অ্যারের (অ্যাজকে থাকা) কী হিসাবে ব্যবহার করার ধারণা। প্রতিটি সমাধানের মূল কী column1 column2তাই যদি দুটি লাইনের একই কলাম দুটি থাকে তবে একটি আলাদা কলাম থাকে তবে সেগুলি পৃথকভাবে গ্রুপ করা হবে:

$ cat file
2 1019 2 3
2 1019 4 1
3 1019 2 2

$ awk '{a[$1" "$2]+=$3+$4}END{for (i in a){print i,a[i]}}' file
3 1019 4
2 1019 10

7

হতে পারে এটি সাহায্য করতে পারে তবে 1 কলাম 1 সর্বদা 2 এবং ফলাফলগুলি কি এর উপর নির্ভর করে?

awk '{ map[$2] += $3 + $4; } END { for (i in map) { print "2", i, map[i] | "sort -t't'" } }' file

বা বাছাই সম্পর্কে মন্তব্যে গ্লেন জ্যাকম্যান দ্বারা উল্লিখিত :

gawk '{ map[$2] += $3 + $4; } END { PROCINFO["sorted_in"] = "@ind_str_asc"; for (i in map) { print 2, i, map[i] } }' file

2
আপনার যদি জিএনইউ অ্যাড থাকে তবে PROCINFO["sorted_in"] = "@ind_num_asc"পাইপ দেওয়ার পরিবর্তে ব্যবহার করুন sort। রেফ gnu.org/software/gawk/manual/html_node/…
গ্লেন জ্যাকম্যান

@ ট্যালিজিন: ধন্যবাদ ট্যালিজিন এবং টেরডন। উভয় পন্থা একটি কবজ মত কাজ। আমি সত্যিই আপনার সাহায্য তারিফ করা.
টমপিও

1
@ ট্যালিজিন: আমি যেমন বলেছিলাম যে দুজনেই আমার পক্ষে কাজ করেছে, আমি টেরডনের উত্তরগুলিকে "সঠিক" হিসাবে চিহ্নিত করেছি। আমার ধারণা তুমি এটাই চাচ্ছ আবার ধন্যবাদ.
টমপ্পি

1
আপনি যদি মোট অনন্য কী চান সেই প্রশ্নটি যদি আমি বুঝতে পারি তবে আমরা কেবলমাত্র একটি পাল্টা যুক্ত করতে এবং এটি মুদ্রণ করতে পারি: awk '{মানচিত্র [$ 2] + = $ 3 + $ 4; (আমি মানচিত্রে) {"2", i, মানচিত্র [i] | এর জন্য} END "বাছাই -t'n '"; CNT ++,; } মুদ্রণ "সম্পূর্ণ অনন্য:"
সিএনটি

1
এটি প্রায় একই রকম: awk '{মানচিত্র [$ 2] + = $ 3 + $ 4; ওসি [$ 2] ++,; (আমি মানচিত্রে) {"2", i, মানচিত্র [i], oc [i] | এর জন্য} END { "বাছাই -t'n '"; ।} ', এখন আপনি ঘটনার সাথে অন্য কলামটি দেখতে পাবেন।
টালিজিন

4

আপনি ডেটা প্রাক-বাছাই করতে পারেন এবং বিশদটি বিশদটি পরিচালনা করতে পারেন:

sort -n infile | awk 'NR>1 && p!=$2 {print p,s} {s+=$3+$4} {p=$2}'

আপনি সঞ্চয়ীটিকে পুনরায় সেট করতে চাইতে পারেন:

sort -n infile | awk 'NR>1 && p!=$2 {print p,s;s=0} {s+=$3+$4} {p=$2}'

আউটপুট:

1019 15
1021 19
1022 28
1030 34

আপনি যদি সত্যিই প্রথম কলামটি রাখতে চান তবে এমন কিছু করুন:

sort -n infile | awk 'NR>1 && p!=$1FS$2 {print p,s} {s+=$3+$4} {p=$1FS$2}'

আউটপুট:

2 1019 15
2 1021 19
2 1022 28
2 1030 34

ব্যাখ্যা

pপরিবর্তনশীল ঝুলিতে $2পূর্ববর্তী লাইনের মান, বা$1FS$2 উপরে দ্বিতীয় ক্ষেত্রে। এর অর্থ {print p,s}হ'ল $2পূর্ববর্তী লাইনের বর্তমান লাইনের ( p!=$2) লাইনের মতোটি না হলে ট্রিগারটি ট্রিগার করা হয় ।


মনে রাখবেন যে প্রথম কলামটির আলাদা মান sort -k2থাকলেও আপনি দ্বিতীয় কলাম অনুসারে বাছাই করতে ব্যবহার করতে পারেন
gaoithe

2

সুইস সেনা ছুরি ব্যবহার mlr:

mlr --nidx   put '$5=$3+$4'   then   stats1 -g 1,2 -f 5 -a sum   infile

আউটপুট:

2   1019    15
2   1021    4
2   1022    9
2   1030    6
2   1031    8

মন্তব্য:

  • --nidxmlrসংখ্যার ক্ষেত্রের নাম ব্যবহার করতে বলে ।

  • put '$5=$3+$4'একটি নতুন 5 তম ক্ষেত্র তৈরি করে 3 এবং 4 ক্ষেত্রের সমষ্টি ।

  • stats1ফাংশন (বা " ক্রিয়া ") একটি ছোট সুইস আর্মি নাইফ হয়
    বেশি সুইস আর্মি নাইফ মধ্যে mlrযেমন বিভিন্ন সঁচায়ক ভিত্তিক ফাংশন সঙ্গে sum, count, mean, ইত্যাদি

    stats1 -g 1,21 এবং 2 কলাম অনুসারে ডেটাগুলিকে গ্রুপ করে এবং -f 5 -a sumতারপরে এই গোষ্ঠীর ক্ষেত্র 5 যোগ করে । stats1 প্রিন্ট শুধুমাত্র নাম ক্ষেত্র।

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