ইউনিক কীভাবে যথেষ্ট অনন্য নয় যে ইউনিক-ইউনিকও রয়েছে?


35

এখানে পেস্টবিন থেকে একটি এলোমেলো ফাইলের কমান্ড রয়েছে :

wget -qO - http://pastebin.com/0cSPs9LR | wc -l
350
wget -qO - http://pastebin.com/0cSPs9LR | sort -u | wc -l
287
wget -qO - http://pastebin.com/0cSPs9LR | sort | uniq | wc -l
287
wget -qO - http://pastebin.com/0cSPs9LR | sort | uniq -u | wc -l
258

ম্যান পেজগুলি -uপতাকাটি কী করছে সে সম্পর্কে স্পষ্ট নয় । কোন পরামর্শ?


4
সাজানোর চেষ্টা করুন | uniq -d | ডাব্লুসিএল এবং আপনি পার্থক্য স্পট হতে পারে। :)
stoeff

উত্তর:


42

সংক্ষিপ্ত সংস্করণ:

  • uniq, ছাড়াই -u, আউটপুট প্রতিটি লাইন অনন্য করে তোলে ।
  • uniq -uইনপুট থেকে কেবল প্রতিটি অনন্য লাইন মুদ্রণ করে ।

কিছুটা দীর্ঘতর সংস্করণ:

uniqলাইনগুলি নকল করা আছে এমন ফাইলগুলির সাথে কাজ করার জন্য এবং কেবলমাত্র যখন সেই লাইনগুলি ইনপুটটিতে ধারাবাহিকভাবে প্রদর্শিত হয়। সুতরাং, এর উদ্দেশ্যে, একটি অনন্য লাইন এমন একটি যা অবিলম্বে নকল হয় না।

( uniqস্বল্পমেয়াদী স্বল্পমেয়াদী স্মৃতি রয়েছে; এটি ইনপুটটিতে কোনও লাইন আগে উপস্থিত হয়েছিল কিনা তা কখনই মনে করতে পারে না, যদি না এটি তাত্ক্ষণিক পূর্ববর্তী লাইন হত - এ কারণেই uniqখুব প্রায়ই যুক্ত হয় sort))

যখন এটি সদৃশ লাইনের একটি রানের মুখোমুখি হয়, আরগ uniqছাড়াই -u, সেই লাইনের একটি অনুলিপি মুদ্রণ করে । (এটি আউটপুট প্রতিটি লাইন অনন্য করে তোলে )।

-uযুক্তি সহ এটি লাইনটির শূন্য অনুলিপিগুলি মুদ্রণ করে - ডুপ্লিকেটগুলির রান কেবলমাত্র আউটপুট থেকে বাদ যায়।


1
আমি সত্যিই চাই বাছাইয়ের প্রয়োজন নেই এমন কোনও বিকল্প ছিল। তবে এটি পুরো ফাইলটি মেমরির মধ্যে রাখতে হবে (বা উত্সটি যদি একটি সাধারণ ফাইল হয় তবে হ্যাশ এবং অফসেট সহ প্রচুর
বুককিপিং করা

3
@ র্যান্ডম 832: এবং কোন দ্বিপটি রাখা উচিত তা সিদ্ধান্ত নেওয়ার প্রয়োজন (প্রথম, শেষ, অন্য কিছু, কনফিগারযোগ্য), এবং এই সিদ্ধান্তটি বিশ্বব্যাপী অ্যালগরিদমকে প্রভাবিত করবে। ঝগড়া।
স্টিভ জেসোপ

1
@ র্যান্ডম 832: যদি এটি টাইপ করার মতো অক্ষরের সংখ্যা প্রায় হয় তবে আপনি এর sort -uপরিবর্তে ব্যবহার করতে পারেন sort | uniq
অলিভার

@ অলিভার আমি মাঝে মধ্যে যে কোনও লাইনের প্রথম উদাহরণটি পুনরায় ব্যবস্থা না করে রাখার ক্ষমতা এবং এগুলি করার জন্য লিখিত স্ক্রিপ্টগুলি চেয়েছিলাম।
র্যান্ডম 832

1
@ এইচডিডি: যদি আপনার সংস্করণটি uniqস্বাভাবিককরণ এবং কোলেশন করে তবে হ্যাঁ। তবে তারপরেও এটি কেবল স্থানীয় বিবেচনা - আপনি জানেন যে বাছাই করা আউটপুটে লাইনটি কোথায় উপস্থিত হবে এবং ঠিক কতগুলি সংলগ্ন রেখা রাখতে হবে তা নির্বাচন করতে হবে। যদি ইনপুটটি বাছাই না করা হয় তবে সিদ্ধান্তটি ইউনিফিকিংয়ের পুরো ক্রিয়াকে প্রভাবিত করে, উদাহরণস্বরূপ আপনি যদি সর্বশেষ নকল রাখতে চলেছেন তবে আপনি ইনপুটটির শেষ লাইনটি না পড়া পর্যন্ত কোনও কিছুই আউটপুট করতে পারবেন না ...
স্টিভ জেসোপ

53

uniqসঙ্গে -uছেড়ে যাওয়া কোন লাইন সদৃশ আছে। এভাবে:

$ printf "%s\n" 1 1 2 3 | uniq
1
2
3
$ printf "%s\n" 1 1 2 3 | uniq -u
2
3

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


11
এটি uniqবলা যেতে পারে distinct, যেহেতু এটি সমস্ত স্বতন্ত্র রেখা uniq -uপ্রিন্ট করে , যেখানে সমস্ত অনন্য লাইন মুদ্রণ করে।
স্টিভ জেসোপ

কিছু লোকালে এটি জিএনইউর সাথে সত্যই অনন্য নয় uniq
cuonglm

আমি অবশ্যই গ্রহণযোগ্য উত্তরটি বেশ কয়েকবার পড়েছি, তবে এটি ডুবে নি Your আপনার উদাহরণ এবং অনুচ্ছেদটি এটি স্পষ্ট করে দেওয়ার পরে (এবং ফিরে গিয়ে স্বীকৃত উত্তরটি পুনরায় পড়তে হবে, আমি এটিও পেয়েছি) :)
মাদিবাদ

18

ইউনিক পসিএক্স স্পেকটি এটিকে স্পষ্টভাবে বর্ণনা করেছে:

-u
    Suppress the writing of lines that are repeated in the input.

-uঅপশন uniqপুনরাবৃত্তি লাইন মুদ্রণ করতে না।

uniqবাইটের তুলনা করে বেশিরভাগ বাস্তবায়ন ব্যবহৃত হয়, যখন জিএনইউ uniqসদৃশ লাইনগুলি ফিল্টার করার জন্য কোলেশন অর্ডার ব্যবহার করে। সুতরাং এটি কিছু লোকেলের মধ্যে ভুল ফলাফল তৈরি করতে পারে, উদাহরণস্বরূপ en_US.UTF-8লোকালে:

$ printf '%b\n' '\U2460' '\U2461' | uniq
①

এবং -uআপনাকে কোনও লাইন দেয়নি:

$ printf '%b\n' '\U2460' '\U2461' | uniq -u
<blank>

তাই আপনার Cবাইট তুলনা পেতে লোকেল সেট করা উচিত :

$ printf '%b\n' '\U2460' '\U2461' | LC_ALL=C uniq
①
②

3
লক্ষ্য করুন কি ভুল এখানে যতটা নয় uniq(যদিও দৃশ্যত POSIX এর অভিপ্রায় এটি () হিসেবে তুলনা strcoll পরিবর্তে বাইট তুলনা করা উচিত ছিল sort -uঐ লোকেল যে ভুল ① আছে ② একই বাছাই হিসাবে)। কমপক্ষে জিএনইউ এর uniqসাথে সামঞ্জস্যপূর্ণ sort -u
স্টাফেন চেজেলাস

@ স্টাফেনচেজেলাস - কোথায় তা প্রকাশিত হয়েছে?
মাইকজার্ভ

আমাদের সম্পর্কে uniqহিসাবে, strcoll উল্টোদিকে যে আমার কাছে অতি আপাত নয় কিন্তু memcmp / strcmp তা করার প্রয়োজন যে জিওফ ছিল । জিএনইউ লোকালগুলি সম্পর্কে as একইভাবে বাছাই করা having সম্পর্কে, এটি স্পষ্টতই একটি বাগ রয়েছে কারণ তাদের একই সাজানোর কোনও কারণ নেই। এটি পসিক্স দ্বারা অনুমোদিত কিন্তু কিছু পরিবর্তন আসছে
স্টাফেন চেজেলাস

8

স্বাভাবিক:

echo "a b a b c c c" | tr ' ' '\n'
a
b
a
b
c
c
c

ইউনিক: পরবর্তী দুটি পুনরাবৃত্তি লাইন নেই

echo "a b a b c c c" | tr ' ' '\n' | uniq
a
b
a
b
c

সাজানো

echo "a b a b c c c" | tr ' ' '\n' | sort
a
a
b
b
c
c
c

সাজান -u: দুটি পুনরাবৃত্তি লাইন নেই

echo "a b a b c c c" | tr ' ' '\n' | sort -u
a
b
c

সাজান / ইউনিট: সমস্ত স্বতন্ত্র

echo "a b a b c c c" | tr ' ' '\n' | sort | uniq
a
b
c

স্বতন্ত্র ঘটনা গণনা করে

echo "a b a b c c c" | tr ' ' '\n' | sort | uniq -c
2 a
2 b
3 c

কেবল যে লাইনগুলি পুনরাবৃত্তি হয় না (প্রথমে সাজানো হয় না)

echo "a b a b c c c" | tr ' ' '\n' | uniq -u
a
b
a
b

কেবল যে রেখাগুলি পুনরাবৃত্তি হয় না (বাছাই করার পরে)

echo "a b a b c c c Z" | tr ' ' '\n' | sort | uniq -u
Z

uniq -d: কেবলমাত্র নকল লাইনগুলি মুদ্রণ করুন, প্রতিটি দলের জন্য একটি

echo "a b a b c c c" | tr ' ' '\n' | uniq -d
c

.. গণনা

echo "a b a b c c c" | tr ' ' '\n' | uniq -dc
3 c

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