কোনও ফাইলের সমস্ত লাইন অনন্য Check


11

আমার কাছে একটি পাঠ্য ফাইল রয়েছে যার মধ্যে লাইন রয়েছে:

This is a thread  139737522087680
This is a thread  139737513694976
This is a thread  139737505302272
This is a thread  139737312270080
.
.
.
This is a thread  139737203164928
This is a thread  139737194772224
This is a thread  139737186379520

আমি কীভাবে প্রতিটি লাইনের স্বতন্ত্রতা সম্পর্কে নিশ্চিত হতে পারি?

দ্রষ্টব্য: নকল লাইন উপস্থিত থাকলে ফাইলটি পরীক্ষা করা, এটির সংশোধন না করার লক্ষ্য।



1
আপনি কি সমস্ত লাইন অনন্য কিনা তা পরীক্ষা করতে চান, বা আপনি কোনও সদৃশ সরাতে চান?
বিট্রি

1
@ 8bittree - অভিলাষও অবশিষ্ট ঠিক নিশ্চিত স্বতন্ত্রতা হতে
SNR

উত্তর:


24
[ "$(wc -l < input)" -eq "$(sort -u input | wc -l)" ] && echo all unique

ঠিক কি আমি বলেন না সঙ্গে ব্যতীত uniqপরিবর্তেsort -u
Nonny আমেরিকার হরিণবিশেষ

1
যদি ইনপুটটি ইতিমধ্যে বাছাই না করা হয় uniqতবে এটি একটি বড় ভুল হবে; এটি কেবল সংলগ্ন লাইনগুলিই নকল করে!
অ্যালেক্সিস

1
যদি কেউ অপরাধীদের প্রতি আগ্রহী হয় তবে একটি sort <file> | uniq -dডুপ্লিকেটগুলি মুদ্রণ করবে।
রল্ফ

25

জাল সমাধান:

awk 'a[$0]++{print "dupes"; exit(1)}' file && echo "no dupes"

4
+1 স্বীকৃত উত্তরটি পুরো ফাইলটির মধ্য দিয়ে দু'বার পড়ে, যখন এটি একটি রিডিতে সদৃশ লাইনটির মুখোমুখি হওয়ার সাথে সাথে এটি বন্ধ হয়ে যায়। এটি পাইপযুক্ত ইনপুট সহও কাজ করবে, অন্য ফাইলগুলি এটি পুনরায় পড়তে পারে needs
জোল

আপনি ঠেলা করা যায়নি echoমধ্যে END?
Ignacio Vazquez-Abram

2
@ ইগনাসিও ওয়াজকেজ-আব্রামস এর প্রতিধ্বনিটির সত্যিকার অর্থে কোনও বক্তব্য নেই। একটি কমান্ড প্রস্থান স্থিতি কোড সহ সঠিক কাজ করে তা বোঝাতে উত্তরে একটি সম্মেলন করা && echoবা || echoকরা। গুরুত্বপূর্ণ বিষয় exit(1)। আদর্শভাবে, আপনি এই মত ব্যবহার করুন if has_only_unique_lines file; then ..., না if [[ $(has_only_unique_lines file) = "no dupes" ]]; then ..., নিরীহ হতে চাই।
JoL

2
অন্য উত্তরগুলি মেমরি সংরক্ষণ করতে দু'বার ফাইলটি পড়ে, সেখানে কোনও ডুপস না থাকলে এটি পুরো ফাইলটিকে মেমরিতে পড়বে।
কুসালানন্দ

1
@ কুসালানন্দ যখন কোনও ডুপ নেই তখন এটি পুরো ফাইলটি মেমোরিতে পড়বে, সেখানে ডুপস sortআছে কিনা তা নির্বিশেষে ইচ্ছামত ব্যবহার করবে না? কীভাবে সেই সঞ্চয়ী স্মৃতি?
জোল

21

ব্যবহার sort/ uniq:

sort input.txt | uniq

কেবল সদৃশ লাইনের জন্য পরীক্ষা করতে -dইউনিকের জন্য বিকল্পটি ব্যবহার করুন । এটি কেবল অনুলিপিযুক্ত রেখাগুলি প্রদর্শন করবে, যদি তা না হয় তবে এটি কিছুই দেখায় না:

sort input.txt | uniq -d

এটা আমার গোটো অন্যান্য, উচ্চ-ভোট প্রাপ্ত উত্তরগুলি কী দেয় তা নিশ্চিত নয় Not
ব্যবহারকারী 1717828

1
সদৃশ অপসারণ করার জন্য এটি ভাল বিকল্প।
SNR

1
এটি যা চায় তা করে না। তিনি জানতে চান যে এখানে নকল আছে কিনা, সেগুলি সরাবেন না।
বর্মার

@ বার্মার: যদিও মনে হচ্ছে যে প্রশ্নটি এখনও অস্পষ্ট। পাশাপাশি ওপিরাও এটিকে স্পষ্ট করার চেষ্টা করছে comment
jesse_b

এখানে একটি মুলতুবি সম্পাদনা রয়েছে যা আরও স্পষ্টতা যোগ করে।
বার্মার

5

TLDR

মূল প্রশ্নটি অস্পষ্ট ছিল, এবং পড়ুন যে ওপি কেবল কোনও ফাইলের বিষয়বস্তুর একটি অনন্য সংস্করণ চায়। এটি নীচে দেখানো হয়েছে। প্রশ্নের আপডেট হওয়া রূপ থেকে ওপি এখন উল্লেখ করছে যে তিনি / তিনি কেবল ফাইলের বিষয়বস্তু অনন্য কিনা তা জানতে চান।


ফাইলের বিষয়বস্তু অনন্য কিনা তা পরীক্ষা করুন

sortকোনও ফাইল অনন্য কিনা বা এর মতো নকল রয়েছে কিনা তা যাচাই করতে আপনি সহজেই ব্যবহার করতে পারেন:

$ sort -uC input.txt && echo "unique" || echo "duplicates"

উদাহরণ

বলুন আমার কাছে এই দুটি ফাইল রয়েছে:

নকল নমুনা ফাইল
$ cat dup_input.txt
This is a thread  139737522087680
This is a thread  139737513694976
This is a thread  139737505302272
This is a thread  139737312270080
This is a thread  139737203164928
This is a thread  139737194772224
This is a thread  139737186379520
অনন্য নমুনা ফাইল
$  cat uniq_input.txt
A
B
C
D

এখন আমরা যখন এই ফাইলগুলি বিশ্লেষণ করি তখন আমরা বলতে পারি যে সেগুলি অনন্য বা ডুপ্লিকেট রয়েছে:

পরীক্ষা নকল ফাইল
$ sort -uC dup_input.txt && echo "unique" || echo "duplicates"
duplicates
পরীক্ষা অনন্য ফাইল
$ sort -uC uniq_input.txt && echo "unique" || echo "duplicates"
unique

মূল প্রশ্ন (ফাইলের অনন্য সামগ্রী)

ঠিক দিয়ে করা যায় sort:

$ sort -u input.txt
This is a thread  139737186379520
This is a thread  139737194772224
This is a thread  139737203164928
This is a thread  139737312270080
This is a thread  139737505302272
This is a thread  139737513694976
This is a thread  139737522087680

3

আমি সাধারণত sortফাইলটি ব্যবহার uniqকরি, তারপরে নকল সংখ্যা গণনা করতে ব্যবহার করি, তারপরে আমি sortআরও একবার তালিকার নীচে ডুপ্লিকেটগুলি দেখতে পাচ্ছি।

আপনার দেওয়া উদাহরণগুলিতে আমি একটি সদৃশ যুক্ত করেছি:

$ sort thread.file | uniq -c | sort
      1 This is a thread  139737186379520
      1 This is a thread  139737194772224
      1 This is a thread  139737203164928
      1 This is a thread  139737312270080
      1 This is a thread  139737513694976
      1 This is a thread  139737522087680
      2 This is a thread  139737505302272

যেহেতু আমি uniqকিছুক্ষণের জন্য ম্যান পৃষ্ঠাটি পড়িনি , তাই আমি কোনও বিকল্পের জন্য তাত্ক্ষণিকভাবে নজর রেখেছি। নিম্নলিখিতটি দ্বিতীয় ধরণের প্রয়োজনটিকে সরিয়ে দেয়, যদি আপনি কেবল নকল দেখতে চান:

$ sort thread.file | uniq -d
This is a thread  139737505302272

এটি প্রকৃতপক্ষে একটি ভাল বিকল্প। #rez
SNR

2

যদি কোনও সদৃশ না থাকে তবে সমস্ত লাইন অনন্য:

[ "$(sort file | uniq -d)" ] && echo "some line(s) is(are) repeated"

বর্ণনা: একটানা বারবার রেখাগুলি তৈরি করার জন্য ফাইল লাইনগুলি বাছাই করুন (সাজান)
সমান (একক-ডি ) সমপর্যায়ের সমস্ত পরের লাইনগুলি বের করুন।
উপরের কমান্ডের কোনও আউটপুট ( [...]) থাকলে, ( &&) একটি বার্তা মুদ্রণ করুন।


2

পার্ল উত্তর ছাড়া এটি সম্পূর্ণ হবে না!

$ perl -ne 'print if ++$a{$_} == 2' yourfile

এটি প্রতিটি অ-অনন্য লাইন একবার মুদ্রণ করবে: সুতরাং এটি যদি কিছু না প্রিন্ট করে তবে ফাইলটিতে সমস্ত অনন্য লাইন রয়েছে।


1

ব্যবহার cmpএবং sortbash:

cmp -s <( sort file ) <( sort -u file ) && echo 'All lines are unique'

অথবা

if cmp -s <( sort file ) <( sort -u file )
then
    echo 'All lines are unique'
else
    echo 'At least one line is duplicated'
fi

এটি গ্রহণযোগ্য উত্তরের মতো যদিও ফাইলটিকে দু'বার বাছাই করবে।

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