"সাজানো -u" এবং "বাছাই করা | এর মধ্যে পার্থক্য কী? uniq "?


119

যেখানেই আমি দেখতে পাচ্ছি যে কাউকে বাছাই করা, অনন্য তালিকা পেতে প্রয়োজন, তারা সর্বদা পাইপ দেয় sort | uniqsort -uপরিবর্তে কেউ ব্যবহার করেন এমন কোনও উদাহরণ আমি কখনও দেখিনি । কেন না? পার্থক্যটি কী, এবং ইউনিটকে অনন্য পতাকার থেকে বাছাই করা কেন ভাল?


উত্তর:


119

sort | uniqএর আগে বিদ্যমান ছিল sort -uএবং এটি সিস্টেমের বিস্তৃত পরিসরের সাথে সামঞ্জস্যপূর্ণ, যদিও প্রায় সমস্ত আধুনিক সিস্টেমই সমর্থন করে -u- এটি পসিক্স। এটি বেশিরভাগই সেই দিনগুলিতে থ্রোকব্যাক যা sort -uঅস্তিত্বহীন ছিল (এবং লোকেরা তাদের পদ্ধতিগুলি পরিবর্তন করার ঝোঁক রাখে না যদি তারা জানে যেভাবে তারা কাজ করে চলেছে তবে কেবল ifconfigবনাম ipগ্রহণের দিকে নজর দিন )।

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

আমার সিস্টেমে আমি ধারাবাহিকভাবে এর মতো ফলাফল পাই:

$ dd if=/dev/urandom of=/dev/shm/file bs=1M count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 8.95208 s, 11.7 MB/s
$ time sort -u /dev/shm/file >/dev/null

real        0m0.500s
user        0m0.767s
sys         0m0.167s
$ time sort /dev/shm/file | uniq >/dev/null

real        0m0.772s
user        0m1.137s
sys         0m0.273s

এটি রিটার্ন কোডেরও মুখোশ দেয় না sort, যা গুরুত্বপূর্ণ হতে পারে (আধুনিক শেলগুলিতে এটি পাওয়ার উপায় রয়েছে, উদাহরণস্বরূপ, bashএর $PIPESTATUSঅ্যারে, তবে এটি সর্বদা সত্য ছিল না)।


31
আমি ব্যবহারের প্রবণতা sort | uniqকারণ 10 এর মধ্যে 9 বার, আমি আসলে পাইপ করছি uniq -c
প্লটর

5
উল্লেখ্য, sort -uএটি 7th ম সংস্করণ ইউনিক্স, প্রায় ১৯৯৯ সালের অংশ ছিল sortsupport সমর্থন ছাড়া সংস্করণগুলি -uসত্যই প্রত্ননির্ভর or এছাড়াও স্ট্যাক ওভারফ্লো দেখুন লিনাক্স শেল মধ্যে সাজান & uniq 2010 থেকে
জনাথন Leffler

3
+1 এর কারণে ip। এটি ২০১ 2016 এবং এই পোস্টটি ২০১৩ সালে, তবে আমি ipএখনই কমান্ড সম্পর্কে জানি ।
ডায়েন্ড

4
"9 বার আউট 10 আমি আসলে পাইপ করছি" এর জন্য +1 uniq -c(এবং সম্ভবত আরও একবার পাইপিং করছি sort -nr | head)। আমি ভাবছিলাম যে sort | uniqভিমের সমতুল্য কী যখন আমি জানতে পারলাম যে ভিমের :sort uকমান্ড রয়েছে। এবং টিআইএল এছাড়াও sort -uবিদ্যমান।
ঝুয়ুন ওয়েই

নোট করুন যে sort -n | uniqবনাম ব্যবহার করার সময় একটি পার্থক্য রয়েছে sort -n -u। উদাহরণস্বরূপ ট্রেলিং এবং শীর্ষস্থানীয় শ্বেতস্থানগুলি সদৃশ দ্বারা sort -n -uনয় তবে নকল হিসাবে দেখা যাবে ! echo -e 'test \n test' | sort -n -uফিরে আসে test, তবে echo -e 'test \n test' | sort -n | uniqউভয় লাইনই ফেরত দেয়।
এমএক্সএমএনএলএনএন

46

একটি পার্থক্য হ'ল uniqবেশ কয়েকটি দরকারী অতিরিক্ত বিকল্প রয়েছে যেমন তুলনা করার জন্য ক্ষেত্রগুলি এড়িয়ে যাওয়া এবং কোনও মানের পুনরাবৃত্তির সংখ্যা গণনা করা। sortএর -uপতাকাটি কেবল অযাচিত uniqআদেশের কার্যকারিতা কার্যকর করে ।


3
একটি দরকারী উত্তরের জন্য +০.৪৯, তবে আমি এটিকে এমন কিছু বাক্য বলব যে "" পরবর্তীকালের দরকারী বিকল্পগুলি যেমন তুলনা করার জন্য ক্ষেত্রগুলি এড়িয়ে যাওয়া এবং পুনরাবৃত্তির সংখ্যা গণনা করার জন্য আউটপুট দেওয়া sort -uযায় না uniq। "
l0b0

15
নায়সায়ারদের অফসেট করার জন্য +1 কারণ "এটিকে সরাসরি বাছাই করার কোনও উপায় নেই " প্রশ্নের উত্তর দেয় ...
ইজকাটা

42

সঙ্গে POSIX অনুবর্তী sorts এবং uniqগুলি (গনুহ uniqবর্তমানে যে বিষয়ে অনুবর্তী নয়), সেখানে একটি পার্থক্য যে sortস্ট্রিং তুলনা করতে লোকেল এর ক্রমানুসারে সাজানো আলগোরিদিম ব্যবহার করে (সাধারণত ব্যবহার করা হবে strcoll()যখন স্ট্রিং তুলনা করতে) uniqবাইট-মান পরিচয়ের জন্য চেক (সাধারণত ব্যবহার করা হবে strcmp()) ।

এটি কমপক্ষে দুটি কারণে গুরুত্বপূর্ণ।

  • কিছু লোকেলগুলিতে, বিশেষত জিএনইউ সিস্টেমে বিভিন্ন অক্ষর রয়েছে যা একই সাজান। উদাহরণস্বরূপ, একটি জিএনইউ সিস্টেমে en_US.UTF-8 লোকালে, সমস্ত ①②③④⑤⑥⑦⑧⑨⑩ ... অক্ষর এবং আরও অনেকগুলি একই অনুসারে বাছাই করে কারণ তাদের সাজানোর ক্রম সংজ্ঞায়িত হয়নি। 0123456789 আরবিক অঙ্কগুলি তাদের পূর্ব আরবি ইন্ডিক প্রতিরূপগুলির (٠١٢٣٤٥٦٧٨٩) হিসাবে একইভাবে সাজান ।

    জন্য sort -u, ① বাছাই করে ② এবং 0123 0123 হিসাবে একই হিসাবে একই, যাতে sort -u, শুধুমাত্র প্রতিটি এক ধরে রাখা কিছুদিনের জন্য হবে uniq(না গনুহ uniqযা ব্যবহার strcoll()(সঙ্গে ব্যতীত -i)), ① থেকে ভিন্ন ② এবং 0123 0123 থেকে আলাদা, তাই uniqসব বিবেচনা করবে 4 অনন্য।

  • strcollকেবলমাত্র বৈধ অক্ষরের স্ট্রিংগুলির তুলনা করতে পারেন (পপিক্স অনুসারে আচরণটি অপরিজ্ঞাত হয় যখন ইনপুটটিতে বাইটের ক্রম থাকে যা বৈধ অক্ষর তৈরি strcmp()করে না ) তবে অক্ষরগুলির যত্ন নেই কারণ এটি কেবল বাইট-টু-বাইট তুলনা করে। সুতরাং এর অন্য কারণ sort -uহ'ল যদি তাদের কয়েকটি বৈধ পাঠ্য না তৈরি করে তবে আপনাকে সমস্ত অনন্য লাইন না দেয়। sort|uniqএখনও অ-পাঠ্য ইনপুটটিতে অনির্দিষ্ট করা অবস্থায়, বাস্তবে আপনাকে সেই কারণে অনন্য লাইন দেওয়ার সম্ভাবনা বেশি।

ঐ সুক্ষ্ণ বিষয়গুলো পাশে, এক জিনিস যে এতদূর লক্ষনীয় করা হয় নি যে uniqপুরো লাইন আভিধানিক তুলনা, যখন sortএর -uকমান্ড লাইন দেওয়া সাজানোর স্পেসিফিকেশন উপর ভিত্তি করে তুলনা করা হয়।

$ printf '%s\n' 'a b' 'a c' | sort -uk 1,1
a b
$ printf '%s\n' 'a b' 'a c' | sort -k 1,1 | uniq
a b
a c

$ printf '%s\n' 0 -0 +0 00 '' | sort -n | uniq
0
-0
+0
00

$ printf '%s\n' 0 -0 +0 00 '' | sort -nu
0

9

আমি ব্যবহার করতে পছন্দ করি sort | uniqকারণ আমি যখন -uমিশ্র কেস স্ট্রিংয়ের সাথে জড়িত নকলগুলি সরিয়ে ফেলার জন্য (সদৃশগুলি অপসারণ) বিকল্পটি ব্যবহার করার চেষ্টা করি তখন ফলাফলটি বোঝা এত সহজ নয়।

দ্রষ্টব্য: আপনি নীচের উদাহরণগুলি চালানোর আগে, আপনাকে নিম্নলিখিতটি করে স্ট্যান্ডার্ড সি কোলটিং ক্রমটি অনুকরণ করতে হবে:

LC_ALL=C
export LC_ALL

উদাহরণস্বরূপ, যদি আমি একই সাথে স্ট্রিংয়ের বিভিন্ন কেস পৃথক করে রেখে একটি ফাইল বাছাই করতে এবং ডুপ্লিকেটগুলি সরিয়ে দিতে চাই।

$ cat short      #file to sort
Pear
Pear
apple
pear
Apple

$ sort short     #normal sort (in normal C collating sequence)
Apple            #the lower case words are at the end
Pear
Pear
apple
pear

$ sort -f short  #correctly sorts ignoring the C collating order
Apple            #but duplicates are still there
apple
Pear
Pear
pear

$ sort -fu short #By adding the -u option to remove duplicates it is 
apple            #difficult to ascertain the logic that sort uses to remove
Pear             #duplicates(i.e., why did it remove pear instead of Pear?)

-uসদৃশ অপসারণের বিকল্পটি ব্যবহার না করে এই বিভ্রান্তির সমাধান করা হয়েছে । ব্যবহার uniqআরও অনুমানযোগ্য। নীচে প্রথমে কেসটিকে সাজান এবং উপেক্ষা করে এবং পরে uniqসদৃশগুলি সরাতে এটি পাস করে ।

$ sort -f short | uniq
Apple
apple
Pear
pear

2
-uএকটি সমান রান প্রথমsort আউটপুট বিকল্প (ম্যান পৃষ্ঠা দেখুন)। এইভাবে প্রতিটি কেস-সংবেদনশীল অনন্য লাইনের প্রথম উপস্থিতিকে তুলে ধরে। সদৃশ অপসারণ করতে ব্যবহার করা যুক্তি অনুমানযোগ্য। sort -fusort
pallxk

3

আরেকটি পার্থক্য যা আমি আজ জানতে পেরেছি তা হল যখন আপনি একটি ডিলিমিটারের ভিত্তিতে বাছাই করেন যেখানে sort -uকেবল যে কলামটি আপনি সাজান তার অনন্য পতাকাটি প্রয়োগ করে।

$ cat input.csv
3,World,1
1,Hello,1
2,Hello,1

$ cat input.csv | sort -t',' -k2 -u
1,Hello,1
3,World,1

$ cat input.csv | sort -t',' -k2 | uniq
1,Hello,1
2,Hello,1
3,World,1

স্টাফেন চেজেলাসের উত্তরে এটি উল্লেখ করা হয়েছে তবে আমি আপনার উদাহরণটি পছন্দ করি তাই +1
রোয়াইমা

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