ডেটা বাছাই না করে কীভাবে কেবল অনন্য ফলাফল পাবেন?


40
$ cat data.txt 
aaaaaa
aaaaaa
cccccc
aaaaaa
aaaaaa
bbbbbb
$ cat data.txt | uniq
aaaaaa
cccccc
aaaaaa
bbbbbb
$ cat data.txt | sort | uniq
aaaaaa
bbbbbb
cccccc
$

আমার যে ফলাফলটি প্রয়োজন তা হ'ল ফাইলে বিবৃতিগুলির মূল ক্রম বজায় রেখে সমস্ত ডুপ্লিকেটগুলি সরিয়ে ফেলা মূল ফাইল থেকে সমস্ত লাইন প্রদর্শন করা (কেবল একের পর এক নয়)

এখানে, এই উদাহরণে, যে ফলাফলটি আমি আসলে খুঁজছিলাম

aaaaaa
cccccc
bbbbbb

আমি সাধারণভাবে এই সাধারণ uniqক্রিয়াকলাপটি কীভাবে সম্পাদন করতে পারি ?

উত্তর:


54
perl -ne 'print unless $seen{$_}++' data.txt

বা, যদি আপনার অবশ্যই এটির অকেজো ব্যবহার থাকেcat :

cat data.txt | perl -ne 'print unless $seen{$_}++'

awkপার্লের অভাব রয়েছে এমন সিস্টেমগুলির জন্য এখানে একটি অনুবাদ রয়েছে:

awk '!seen[$0]++' data.txt
cat data.txt | awk '!seen[$0]++'

3
একজন সামান্য খাটো awk স্ক্রিপ্ট হয়{ if (!seen[$0]++) print }
camh

1
@ ফ্রেড, যদি না আপনার ফাইলটি সত্যই বিশাল হয় তবে সংস্করণটি টাইপ করতে বেশি সময় নেয় এটি চালানোর চেয়ে বেশি।
সিজেএম

8
Awk সংস্করণটি যাব দ্বারা এমনকি খাটো করা যেতে পারে if, print: প্রথম বন্ধনী, এবং ধনুর্বন্ধনীawk '!seen[$0]++'
গর্ডন Davisson

2
@ লিগেট, এটি এমন একটি অ্যারের নাম যা আমরা দেখেছি প্রতিটি লাইন রেকর্ড করে। আপনি '!LarryWall[$0]++'সমস্ত অজানা যত্নের জন্য এটিতে পরিবর্তন করতে পারেন , তবে "দেখা" লোকজনকে প্রোগ্রামটি আরও ভালভাবে বুঝতে সহায়তা করে।
সিজেএম

1
@ সাদি, এটিকে আসলেই একটি প্রশ্ন হিসাবে জিজ্ঞাসা করা উচিত ছিল, কোনও মন্তব্য নয়। তবে সেই ফাইলের কয়েকটি লাইন একটি স্পেসে শেষ হয়, এবং কিছু থাকে না। এই কমান্ডগুলি পুরো লাইনটিকে উল্লেখযোগ্যভাবে বিবেচনা করে, শেষের দিকে সাদা অংশ সহ p
সিজেএম

13

জন এর একটি সরঞ্জাম রয়েছে যার নাম রয়েছে unique:

usr@srv % cat data.txt | unique out
usr@srv % cat out
aaaaaa
cccccc
bbbbbb

একটি একক কমান্ডলাইনে অতিরিক্ত সরঞ্জাম ছাড়াই এটি অর্জন করা কিছুটা জটিল:

usr@srv % cat data.txt | nl | sort -k 2 | uniq -f 1 | sort -n | sed 's/\s*[0-9]\+\s\+//'
aaaaaa
cccccc
bbbbbb

nlলাইনের সামনে লাইন নম্বর প্রিন্ট করে, সুতরাং আমরা sort/ uniqতাদের পিছনে থাকলে আমরা লাইনের মূল ক্রমটি পুনরুদ্ধার করতে পারি। sedকেবলমাত্র পরে লাইন নম্বরগুলি মুছবে;)


সাধারণ লিনাক্স কমান্ডের এমন কোনও সংমিশ্রণ রয়েছে যা একই কাজ করতে পারে?
লেজার

7
"ডেটা বাছাই না করে" আপনি কী মিস করেছেন?
টোটার

@Totor - দেখুন menkus ' উত্তর একই মন্তব্যের। @ বিনফলস - আপনার দ্বিতীয় সমাধানটি কাজ করে না (সম্ভবত এটি এই তুচ্ছ নমুনার সাথে কাজ করে তবে এটি কিছু বাস্তব জীবনের ইনপুট নিয়ে কাজ করে না)। দয়া করে এটি ঠিক করুন, উদাহরণস্বরূপ এটি সর্বদা কাজ করা উচিত:nl -ba -nrz data.txt | sort -k2 -u | sort | cut -f2
don_crissti

6

আমি এটি ব্যবহার করতে পছন্দ করি:

cat -n data.txt | sort --key=2.1 -b -u | sort -n | cut -c8-

cat -n লাইন সংখ্যা যুক্ত করে,

sort --key=2.1 -b -u দ্বিতীয় ক্ষেত্রের ধরণ (যুক্ত লাইন সংখ্যার পরে), নেতৃস্থানীয় ফাঁকা উপেক্ষা করে অনন্য লাইন রেখে

sort -n কঠোর সংখ্যায়িক ক্রমে বাছাই

cut -c8- 8 টি কলাম থেকে EOL পর্যন্ত সমস্ত অক্ষর রাখুন (যেমন, আমরা অন্তর্ভুক্ত রেখা সংখ্যা বাদ দাও)


5
> ডেটা বাছাই না করে কীভাবে কেবল অনন্য ফলাফল পাবেন? > ডেটা বাছাই ছাড়াই
জান উইখলম

7
'ডেটা বাছাই না করে' কেবল শিরোনামে উপস্থিত হয়। আসল প্রয়োজনটি হ'ল: "ফাইলটিতে স্টেটমেন্টের মূল ক্রম বজায় রেখে সমস্ত ডুপ্লিকেট মুছে ফেলা মূল ফাইল থেকে সমস্ত লাইন প্রদর্শন করুন (কেবল ধারাবাহিকগুলি নয়)।"
মেনকাস

1
@ মেনকাস কীটি "ফাইলটিতে বিবৃতিগুলির মূল ক্রম বজায় রাখার সময়"। এই উত্তরটি তা অর্জন করে না।
অ্যান্ড্রু ফেরিয়ার 6'18

2

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

use List::MoreUtils qw(uniq)    
@output = uniq(@output);

আপনি এই মডিউল সম্পর্কে এখানে আরও পড়তে পারেন: তালিকা :: মোর ইউটিলেট


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