অন্য কলামের মানের ভিত্তিতে সদৃশগুলি সরান


9

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

AA,true
AA,false
BB,false
CC,false
BB,true
DD,true

আমি সদৃশ সন্ধান করার এবং কলাম মান সমান লাইনটি সরিয়ে দেওয়ার চেষ্টা করছি true

আউটপুট হিসাবে এটি হওয়া উচিত:

AA,false
BB,false
CC,false
DD,true

2
সুতরাং .. trueএটি রাখা যদি এটি প্রথম কলামের প্রথম উদাহরণ?
ডোপঘোতি

1
@ রোমানপেরেখারেস্ট সম্ভবত একটি ইউনিক প্রবেশ এবং এটি "যেমন আছে" তে মুদ্রিত হয়েছে
জর্জ ভ্যাসিলিউ

@ রোমানপেরেখারেস্ট কারণ ডিডি, সত্য এটি কোনও সদৃশ নয় যে আমাদের ডিডির সাথে আর একটি লাইন নেই, মিথ্যা।
হানি Gotc

AA,true AA,false AA,false AA,falseএক্ষেত্রে কী আউটপুট হওয়া উচিত? আমি বুঝতে পারি, সেই সারিটি কেবল তখনই মুছে ফেলা উচিত যখন এটির সদৃশ থাকে trueএবং একই সাথে থাকে। সমস্ত falseসারি কোনও ক্ষেত্রেই অচ্ছুত থাকতে হবে। অর্থাৎ, এক্ষেত্রে কেবল AA, trueঅপসারণ করা হবে। তবে সমস্ত উত্তর কেবল একটি লাইন ছেড়ে দেয় - AA,false। কেবল আকর্ষণীয় :)
মিনিম্যাক্স

উত্তর:


9
awk -F, '$2 == "false" {data[$1]=$2 } $2=="true" { if ( data[$1]!="false" ) { data[$1]=$2 } } END { OFS=","; for (item in data) { print item,data[item] }}' input

স্ক্রিপ্টটি উল্লম্বভাবে প্রসারিত করার জন্য:

BEGIN {
   FS=","         # Set the input separator; this is what -F, does.
}
$2 == "false" {    # For any line whose second field is "false", we
   data[$1]=$2     # will use that value no matter what.
}
$2=="true" {                    # For lines whose second field is "true",
   if ( data[$1]!="false" ) {   # only keep if if we haven't yet seen a
      data[$1]=$2               # "false"
   }
}
END {                           # Now that we have tabulated our data, we
   OFS=","                      # can print it out by iterating through 
   for (item in data) {         # the array we created.
      print item,data[item]
   }
}

@ দোপগোতি ভালভাবে ব্যাখ্যা করেছেন! আপনি আমার এই +1 পেয়েছেন।
ভ্যালেন্টিন বজরামি

14

সাধারণ সংস্করণ:

sort input.txt | awk -F, '!a[$1]++'

"মিথ্যা" বর্ণানুক্রমিকভাবে "সত্য" এর আগে বাছাই করে এবং এখানে ডকুমেন্ট কমান্ড কেবল প্রতিটি পৃথক প্রথম ক্ষেত্রের মানের জন্য প্রথম সারিটি কেবল রাখে।

যদি আপনি "মিথ্যা" এর পরিবর্তে "সত্য" রাখতে চান তবে এটি বিপরীতভাবে সাজান, এটি একই অ্যাওক কমান্ডে প্রেরণ করুন এবং এরপরে আবার এটিকে পুনরায় সাজান।


1
এছাড়াও, যদি -uবিকল্প উপলব্ধ থাকেsort input.txt | sort -t, -u -k1,1
সন্দীপ

2
@ সন্দীপ কেন দুটি sortকল ব্যবহার করবেন ? শুধু কেন নয় sort -ut, -k1,1 input.txt ?
টেরডন

2
@ স্টারডন কারণ -uডুপ্লিকেটগুলির মধ্যে ইনপুট ফাইল থেকে পাওয়া প্রথম লাইনটি ধরে রাখবে ... প্রদত্ত ক্ষেত্রে, -uআবেদনের আগে ইনপুটটি বাছাই করতে হবে ... প্রাক্তন: প্রদত্ত নমুনায় প্রথম প্রদর্শিত হওয়ার AA,trueপরিবর্তে মুদ্রণ করা হবে AA,false.. awk -F, '!a[$1]++'একা কেন এই সমস্যাটি সমাধান করবেন না
সন্দীপ

5
perl -F, -lane '
   exists $h{$F[0]} or $h[$h{$F[0]}=@h]=$_;
   $h=$_; /,false$/ or $_=$h for $h[$h{$F[0]}];
   END{ print for @h; }
' duplicates.file

উপাত্ত কাঠামো:

  • হ্যাশ %hযার চাবিগুলি প্রথম ক্ষেত্র (এএএ, বিবিবি, সিসিসি, ইত্যাদি) এবং সংশ্লিষ্ট মানগুলি এমন ক্রমগুলি দেখায় যাতে কীগুলি সম্মুখীন হয়েছিল। সুতরাং, উদাহরণস্বরূপ, কী এএএ => 0, কী বিবিবি => 1, কী সিসিসি => 2।
  • অ্যারে @hযার উপাদানগুলি মুদ্রণের ক্রমে অন্তর্ভুক্ত লাইন রয়েছে। সুতরাং যদি সত্য এবং মিথ্যা উভয়ই ডেটাতে পাওয়া যায়, তবে মিথ্যা মানটি অ্যারেতে চলে যাবে। OTW, যদি এক ধরণের ডেটা থাকে তবে তা উপস্থিত থাকবে that

আর একটি উপায় জিএনইউ সেড ব্যবহার করছে:

sed -Ee '
   G
   /^([^,]*),(false|true)\n(.*\n)?\1,\2(\n|$)/ba
   /^([^,]*)(,true)\n(.*\n)?\1,false(\n|$)/ba
   /^([^,]*)(,false)\n((.*\n)?)\1,true(\n|$)/{
      s//\3\1\2\5/;h;ba
   }
   s/([^\n]*)\n(.*)$/\2\n\1/;s/^\n*//
   h;:a;$!d;g
' duplicates.file

FWIW, উপরের জিএনইউ-সেড কোডের জন্য পসিক্স সমতুল্য কোডটি নীচে তালিকাভুক্ত করা হয়েছে:

sed -e '
   G

   /^\([^,]*\),\(false\)\n\(.*\n\)\{0,1\}\1,\2$/ba
   /^\([^,]*\),\(false\)\n\(.*\n\)\{0,1\}\1,\2\n/ba

   /^\([^,]*\),\(true\)\n\(.*\n\)\{0,1\}\1,\2$/ba
   /^\([^,]*\),\(true\)\n\(.*\n\)\{0,1\}\1,\2\n/ba

   /^\([^,]*\),true\n\(.*\n\)\{0,1\}\1,false$/ba
   /^\([^,]*\),true\n\(.*\n\)\{0,1\}\1,false\n/ba

   /^\([^,]*\)\(,false\)\n\(\(.*\n\)\{0,1\}\)\1,true$/{
      s//\3\1\2/
      h
      ba
   }
   /^\([^,]*\)\(,false\)\n\(\(.*\n\)\{0,1\}\)\1,true\n/{
      s//\3\1\2\n/
      h
      ba
   }

   y/\n_/_\n/
   s/\([^_]*\)_\(.*\)$/\2_\1/;s/^_*//
   y/\n_/_\n/

   h;:a;$!d;g
' duplicates.file

ব্যাখ্যা

  • এই পদ্ধতিতে আমরা ফলাফলটি অবশেষে হোল্ড স্পেসে মুদ্রিত করতে সঞ্চয় করি।
  • প্রতিটি লাইনের পঠনের জন্য, হোল্ড স্পেসটির বিদ্যমান অবস্থার তুলনায় বর্তমান লাইনের পরীক্ষার জন্য আমরা হোল্ড স্পেসটি প্যাটার্ন স্পেসে যুক্ত করব।
  • এই তুলনার সময় এখন 5 টি জিনিস সম্ভবত ঘটতে পারে:
    • ক) বর্তমান লাইনটি হোল্ড লাইনের কোথাও মেলে এবং মিথ্যা: মিথ্যা।
      • [ক্রিয়া] যেহেতু একই ভুয়া অবস্থা পাওয়া যায়, তাই কিছুই করবেন না।
    • খ) বর্তমান লাইনটি হোল্ড লাইনের কোথাও মেলে এবং সত্য: সত্য।
      • [ক্রিয়া] যেহেতু একই প্রকৃত অবস্থা পাওয়া যায়, তাই কিছুই করবেন না।
    • গ) বর্তমান লাইনটি হোল্ড লাইনের কোথাও মেলে এবং সত্য: মিথ্যা।
      • [ক্রিয়া] যেহেতু একটি ভুয়া অবস্থা ইতিমধ্যে বিদ্যমান, তাই কিছুই করবেন না।
    • d) বর্তমান লাইনটি হোল্ড লাইনের কোথাও মেলে এবং মিথ্যা: সত্য।
      • [অ্যাকশন] এটিতে কিছু কাজ জড়িত, এর মধ্যে আমাদের সত্য যেখানে অবস্থিত সেখানে ঠিক একই অবস্থানে ভুয়া রেখাটি প্রতিস্থাপন করতে হবে।
    • ঙ) বর্তমান লাইন হোল্ড লাইনের কোথাও মেলে না।
      • [ACTION] বর্তমান লাইনটি শেষের দিকে সরান।

ফলাফল

AA,false
BB,false
CC,false
DD,true

3

প্রতিটি ইনপুট লাইনের জন্য, সহযোগী অ্যারেতে দ্বিতীয় ক্ষেত্রের মান সংরক্ষণ করুন a(অ্যারের কী হিসাবে প্রথম ক্ষেত্রটি ব্যবহার করে) কেবলমাত্র যদি আমরা ইতিমধ্যে falseসেই কীটির জন্য মানটি সংরক্ষণ না করে থাকি । ,উভয় ইনপুট এবং আউটপুট ক্ষেত্র বিভাজকের জন্য ব্যবহার করুন। আমরা সমস্ত ইনপুট লাইন পড়ার পরে অ্যারেটি মুদ্রণ করুন।

$ awk -F, -v OFS=, 'a[$1] != "false" { a[$1] = $2 };
                    END { for (i in a) {print i,a[i]} }' truefalse.txt
AA,false
BB,false
CC,false
DD,true

এটি এবং ডোপঘোটির সংস্করণের মধ্যে উল্লেখযোগ্য পার্থক্য হ'ল এই সংস্করণটির মান সম্পর্কে মোটেও পাত্তা দেয় না $2, এটি কেবল তার মানটি, যদি কোনও হয় তবেই যত্ন করে a[$1]


1

দ্বি-পাস sortসমাধান

sort -k1,1 -k2,2 -t, file | sort -k1,1 -t, -u

একটি সাধারণ ক্ষেত্রের মান ভাগ করে নেওয়ার রেকর্ডের প্রতিটি ব্লকের পূর্ববর্তী রেকর্ডগুলির সাথে sortক্ষেত্রের 1মাধ্যমে প্রথম ক্লাস্টার রেকর্ডগুলি পাস করুন । দ্বিতীয় পাসটি ক্ষেত্র সৌজন্যে প্রতিটি স্বতন্ত্র মানের জন্য একটি রেকর্ড উত্পন্ন করার জন্য সেট আপ করা হয় । যেহেতু স্থিতিশীল সাজান হিসাবে বোঝানো হয়েছে, এইভাবে প্রাপ্ত একটি রেকর্ড হ'ল ক্ষেত্রের মধ্যে প্রতিটি স্বতন্ত্র মানের জন্য প্রথম রেকর্ড - যা প্রথম পাসের কাজটির কারণে দ্বিতীয় ক্ষেত্রে রেকর্ডfalsetrue1sort1-u-u1falsesort

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