অনন্য লাইন মুদ্রণ


15

sortএবং এর সংমিশ্রণ ব্যতীত অনন্য লাইনগুলি মুদ্রণের জন্য আরও কিছু ভাল সমাধান আছে কি uniq?


1
"ভাল" বলতে কী বোঝ?
গ্যাবে

@ গ্যাবে উদাহরণস্বরূপ পুরো ফাইলটি মেমরির মধ্যে সঞ্চয় করার প্রয়োজন নেই।
23_11

sortইনপুটটি র‍্যামের সাথে মানানসইভাবে ফিট না থাকলে অধ্যায়ের কিছু সংস্করণ (যেমন, জিএনইউ কোর্টিল) অস্থায়ী ফাইল এবং বাহ্যিক সংযুক্তি ব্যবহার করে। এবং অন্যান্য সংস্করণগুলির একটি -mবিকল্প রয়েছে যাতে এটি স্পষ্টভাবে ইনপুটটি ছাঁটাই করে করা যায় (উদাহরণস্বরূপ split) এর সাথে প্রতিটি অংশকে বাছাই করে এবং তারপর
খণ্ডগুলি

উত্তর:


25

প্রতিটি অভিন্ন লাইনটি কোনও ক্রমে মুদ্রণ করতে:

sort -u

যে কোনও ক্রমে কেবল অনন্য লাইনগুলি মুদ্রণ করতে:

sort | uniq -u

প্রতিটি অভিন্ন লাইন কেবল একবার তাদের প্রথম উপস্থিতির ক্রম হিসাবে মুদ্রণ করতে: (প্রতিটি লাইনের জন্য, লাইনটি এখনও দেখা না গেলে এটি মুদ্রণ করুন, তবে কোনও ক্ষেত্রে দেখা পাল্টা বৃদ্ধি করুন)

awk '!seen[$0] {print}
     {++seen[$0]}'

তাদের প্রথম উপস্থিতির ক্রম অনুসারে কেবল অনন্য লাইনগুলি মুদ্রণ করতে: (প্রতিটি লাইনটি রেকর্ড করুন seen, এবং এটিও linesযদি প্রথম ঘটনা ঘটায় তবে ইনপুট শেষে, লাইনগুলি ঘটনার ক্রমানুসারে প্রিন্ট করুন তবে কেবল কেবল দেখা যায় একদা)

awk '!seen[$0]++ {lines[i++]=$0}
     END {for (i in lines) if (seen[lines[i]]==1) print lines[i]}'

8
কীভাবে awk '!seen[$0]++ {print}'?
সাউন্ডমোভ

10
বা এমনকি আরও ছোট awk '!seen[$0]++', যেহেতু এটি {print}একটি খালি কমান্ড দ্বারা বোঝানো হয়েছে।
কোজগার

3

কয়েকটি (সর্বাধিক?) সংস্করণে sortএকটি -uপতাকা রয়েছে যা uniqঅংশটি সরাসরি করে। বাস্তবায়নের উপর নির্ভর করে কিছু লাইন দৈর্ঘ্যের সীমাবদ্ধতা থাকতে পারে, তবে আপনার ইতিমধ্যে প্লেইন রয়েছে sort|uniq


1
Er? sort -uকমপক্ষে V7 এ ফিরে যায়।
গাইকোসর

হুম ... আমি ভেবেছিলাম সোলারিস বা এআইএক্সের কথা মনে নেই having আমি যদিও ভুল, দুজনেরই আছে।
মাদুর

সোলারিস এবং এআইএক্সের রয়েছে -uতবে 512-চরিত্রের লাইন দৈর্ঘ্যের সীমাবদ্ধতা রয়েছে। (আসলে, আমি কাছাকাছি সোলারিস 9 সূর্যের কোথাও মনে করি, 5120. গনুহ এখনও জেতে তা পৌঁছে গেছে যদিও।)
geekosaur

@ গেকোসৌর: আপনি কি নিশ্চিত? সাজানো লাইনের দৈর্ঘ্যের 512-বাইট সীমা সরিয়ে ফেলতে যে কাজ করা হয়েছে তা জেপি লিন্ডারম্যান, বেল সিস্টেম টেকনিক্যাল দ্বারা 'থিওরি অ্যান্ড প্র্যাকটিস ইন দ্য ওয়ার্কিং সাজ্ট রুটিনের নির্মাণে' নথিবদ্ধ করা হয়েছিল। জার্নাল, 63, 1827- 1843 (1984)।
জোনাথন লেফলার

0

পার্ল কি আপনার জন্য কাজ করে? সদৃশ সংলগ্ন না হলেও এটি লাইনগুলি মূল ক্রমে রাখতে পারে। আপনি এটি পাইথনে কোড করতে পারেন, বা awk

while (<>) {
    print if $lines{$_}++ == 0;
}

যা কেবল সংক্ষিপ্ত করা যেতে পারে

perl -ne 'print unless $lines{$_}++;'

প্রদত্ত ইনপুট ফাইল:

abc
def
abc
ghi
abc
def
abc
ghi
jkl

এটি আউটপুট দেয়:

abc
def
ghi
jkl

$ রেখাগুলি কোথায় সংজ্ঞায়িত হচ্ছে?
গ্রেগ লেভেন্টাল

এটা না। যেহেতু কোনও use strict;বা নেই use warnings;(প্রকৃতপক্ষে, এটি strictএখানে সর্বাধিক প্রাসঙ্গিক) %linesতাই এটি সংজ্ঞায়িত হওয়ার আগে ব্যবহার করার বিষয়ে কোনও অভিযোগ নেই । যদি কঠোরতার সাথে চালানো হয় my %lines;তবে লুপের আগে একটি লাইন হওয়া দরকার । নোট, এছাড়াও, হ্যাশ যে %lines; হ্যাশটির একটি উপাদান $lines{$_}স্বরলিপি ব্যবহার করে উল্লেখ করা হয়।
জোনাথন লেফলার

আমি মনে করি sortসমাধানগুলি বৃহত পরিমাণে ডেটার জন্য ভাল হতে পারে (ওপি "মেমরিতে পুরো ফাইলটি সংরক্ষণ করার বিষয়ে উদ্বিগ্ন ছিল)"। sortযদি ডেটা উপলব্ধ মেমরির চেয়ে বড় হয় তবে একটি আউট-অফ-কোর বাছাই করবে।
কুসালানন্দ

0

উল্লিখিত উত্তরের শেষ অংশের জন্য: এই প্রশ্নের উত্তর হিসাবে @ গিলস দ্বারা অনন্য লাইনগুলি মুদ্রণ করে আমি দুটি হ্যাশ ব্যবহারের প্রয়োজনীয়তা অপসারণ করার চেষ্টা করেছি।

এই সমাধানটি এর জন্য: কেবলমাত্র অনন্য লাইনগুলি প্রিন্ট করতে তাদের প্রথম উপস্থিতির ক্রম অনুসারে:

awk '{counter[$0]++} END {for (line in counter) if (counter[line]==1) print line}'

এখানে, "কাউন্টার" প্রতিটি রেখার একটি গণনা সঞ্চয় করে যা আগে প্রক্রিয়াজাতকরণের অনুরূপ।
শেষে, আমরা কেবল সেই লাইনগুলি মুদ্রণ করি, যার মান হিসাবে 1 হয়।

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