কমান্ড যা কেবল একবার মুদ্রণ করবে যদিও এটি বহুবার প্রদর্শিত হয়


8

আমার কাছে একটি বড় টেক্সট ফাইল রয়েছে যাতে মানগুলি বহুবার পুনরাবৃত্তি হয়। এমন কোনও কমান্ড আছে যা আমি ব্যবহার করতে পারি যা ফাইলের মধ্য দিয়ে যাবে এবং যদি কোনও মান একবার উপস্থিত হয় তবে এটি পুনরায় পুনর্বার করবেন না?

SO4
HOH
CL
BME
HOH
SO4
HOH
CL
BME
HOH
SO4
HOH
SO4
HOH
CL
BME
HOH
SO4
HOH
CL
BME
HOH
CL

সুতরাং এটি কিছু দেখতে হবে:

S04   
HOH  
CL   
BME 

জিনিসটি হ'ল আমার কাছে প্রচুর বিভিন্ন মান রয়েছে, সুতরাং এটি এখানে ম্যানুয়াল হিসাবে করতে পারে না।

উত্তর:


11

আপনি কমান্ডটি sortবিকল্পের সাহায্যে ব্যবহার করতে পারেন --unique:

sort -u input-file

আপনি যদি স্ট্যান্ডার্ড আউটপুটের পরিবর্তে ফলকে ফল লিখতে চান তবে বিকল্পটি ব্যবহার করুন --output=FILE:

sort -u input-file -o output-file

কমান্ডটি uniqপ্রয়োগ করা যেতে পারে। এক্ষেত্রে অভিন্ন লাইনগুলি অবশ্যই পরিণামযুক্ত হতে পারে, সুতরাং ইনপুটটি প্রাথমিকভাবে বাছাই করতে হবে - এই নোটের জন্য @ রন জনকে ধন্যবাদ :

sort input-file | uniq > output-file

আমি sortঅনুরূপ মামলার জন্য কমান্ডটি তার সরলতার কারণে পছন্দ করি তবে আপনি যদি বড় অ্যারে দিয়ে কাজ করেন তবে জন awk1024 এর উত্তরটি আরও শক্তিশালী হতে পারে। এখানে প্রায় 5 মিলিয়ন লাইন সহ একটি ফাইলের (উপরের উদাহরণের ভিত্তিতে) প্রয়োগ করা উল্লিখিত পদ্ধতির মধ্যে একটি সময়ের তুলনা করা হয়েছে:

$ cat input-file | wc -l
20000000

$ TIMEFORMAT=%R
$ time sort -u input-file | wc -l
64
7.495

$ time sort input-file | uniq | wc -l
64
7.703

$ time awk '!a[$0]++' input-file | wc -l      # from John1024's answer
64
1.271

$ time datamash rmdup 1 < input-file | wc -l  # from αғsнιη's answer
64
0.770

অন্যান্য গুরুত্বপূর্ণ পার্থক্য করা হয় যে উল্লেখ @Ruslan :

sort -uইনপুট শেষ হয়ে গেলেই কেবল ফলাফলটি মুদ্রণ করা হবে, যখন এই awkআদেশটি ফ্লাইতে প্রতিটি নতুন ফলাফল লাইন প্রিন্ট করবে (এটি ফাইলের চেয়ে পাইপযুক্ত ইনপুটটির জন্য আরও গুরুত্বপূর্ণ হতে পারে)।

এখানে একটি উদাহরণ দেওয়া হল:

এখানে চিত্র বর্ণনা লিখুন

উপরের উদাহরণে, লুপটি (নীচে দেখানো হয়েছে) এডি বর্ণের 500 অক্ষর সংমিশ্রণ, প্রতিটি অক্ষরের দৈর্ঘ্য সহ প্রতিটি তৈরি করে। এই সংমিশ্রণগুলি পাইপ করা হয় awkবা হয় sort

for i in {1..500}; do cat /dev/urandom | tr -dc A-D | head -c 3; echo; done

1
এটি খুব সাধারণ আদেশ! অনেক ধন্যবাদ! শুভকামনা.
djordje

2
ওহ, যে দিনগুলির জন্য একটি ইউটিলিটি একটি কাজ করেছে এবং এটি ভাল করেছে !! sort input-file | uniq!!!!
রনজহান

15

আপনি যদি আউটপুট লাইনগুলিকে ইনপুট লাইনের মতো একই ক্রমে রাখতে চান তবে ব্যবহার করুন:

$ awk '!a[$0]++' file
SO4
HOH
CL
BME

কিভাবে এটা কাজ করে:

এটি aপ্রতিটি লাইন পূর্বে যে বার দেখা হয়েছে তার সংখ্যা গণনা করতে এটি মিশ্র অ্যারে ব্যবহার করে । আগে যদি এটি না দেখা যায় তবে লাইনটি মুদ্রিত হয়।


2
এটি খুব কৃপণ awk, তবে sort -uএটি সহজ উপায়।
পিয়েরে ফ্রান্সোইস

4
@ পিয়েরফ্রানিয়োইস, তবে sort -uএটিও সবচেয়ে ধীরতম উপায় :) আমি দুটি পদ্ধতির মধ্যে সময়ের তুলনা করে আমার উত্তর আপডেট করেছি।
pa4080

4
এছাড়াও, sort -uকেবলমাত্র ইনপুট শেষ হওয়ার পরে ফলাফলটি মুদ্রণ করবে, যখন এই awkআদেশটি ফ্লাইতে প্রতিটি নতুন ফলাফল লাইন প্রিন্ট করবে (এটি ফাইলের চেয়ে পাইপযুক্ত ইনপুটটির জন্য আরও গুরুত্বপূর্ণ হতে পারে)।
রুসলান

এই নোটের জন্য ধন্যবাদ, @ রুসলান! আমি আমার উত্তরে এটি চিত্রিত করার চেষ্টা করেছি।
pa4080

আমি অবশ্যই স্বীকার করতে পারি যে awkসমাধানটি খুব ভাল একটি, যত সহজে পড়া যায় না sort
পিয়েরে

1

আপনি নীচে GNU ব্যবহার করতে পারেন datamashএবং লাইন ক্রম রাখবেন।

datamash rmdup 1 < infile

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