একটি ফাইলে আইডি সন্ধান করুন যা অন্যটিতে নেই Find


9

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

abc.txt

abcd
xyz
pqrs

mno.txt

zzon
mkno
abcd
  • Mno.txt ফাইলটিতে "abcd" আছে কিনা তা আমি যাচাই করতে চাই ।
  • এটা তোলে প্রয়োজন নেই যে যদি "abcd" প্রথম abc.txt এটা করবেন FIRST, mno.txt
  • উভয় ফাইলে এমন হাজার হাজার আইডি রয়েছে।
  • আমি আরও পরীক্ষা করতে চাই যে কতগুলি আইডি mno.txt এ নেই যা abc.txt এ রয়েছে

কিভাবে আমি এটি করতে পারব ?

উত্তর:


19

যদি আপনার লক্ষ্যটি সাধারণ বা অস্বাভাবিক লাইনগুলি সন্ধান commকরা হয় তবে আমার এখানে যেতে আদেশ হবে be

এটি দুটি ফাইলের তুলনা করে এবং তিনটি কলামে লাইন দেখায় যা ফাইল 1 টির জন্য অনন্য, 2 টি ফাইলের জন্য অনন্য লাইন এবং উভয় ফাইলগুলিতে যথাক্রমে উপস্থিত রেখাগুলি। এই আউটপুটটির যে কোনওটিকে দমন করতে আপনি পতাকাগুলি পাস করতে পারেন। উদাহরণস্বরূপ comm -1 file1 file2, প্রথম কলামটি দমন করবে, ফাইল -1-তে অনন্য জিনিস। comm -12 file1 file2উভয় ফাইলের মধ্যে কেবল জিনিসগুলি দেখায়।

একটি বড় ক্যাভিয়েট রয়েছে: ইনপুটটি বাছাই করতে হবে। আমরা এটি প্রায় কাজ করতে পারেন।

এটি আপনাকে abc এ যা কিছু পাঠিয়েছে তা দেখাবে:

comm -23 <(sort abc.txt) <(sort mno.txt)

এবং আপনি এটিতে পাইপ করতে পারেন wc -lএকটি গণনা পেতে।


আমি যে কারণে যাচ্ছি commতা হ'ল একবার ফাইলগুলি বাছাই করার পরে, পাশাপাশি পাশাপাশি তুলনাটি কম্পিউটেশনালি সত্যই সহজ। যদি আপনি এই কয়েক মিলিয়ন এর সাথে লেনদেন করেন তবে এটি একটি পার্থক্য আনবে।

এটি বেশ কয়েকটি মক ফাইল দিয়ে প্রদর্শিত হতে পারে। আমার কাছে একটি মোটামুটি দ্রুত কম্পিউটার রয়েছে যাতে পদ্ধতির মধ্যে পার্থক্যটি দেখানোর জন্য আমার বেশ বড় একটি নমুনা সেট প্রয়োজন। আমি প্রতি ফাইলটিতে 10 মিলিয়ন 10-চর স্ট্রিংয়ে গিয়েছি।

$ cat /dev/urandom | tr -dc '0-9' | fold -w 10 | head -10000000 > abc.txt
$ cat /dev/urandom | tr -dc '0-9' | fold -w 10 | head -10000000 > mno.txt

$ time comm -23 <(sort abc.txt) <(sort mno.txt) | wc -l
... 0m10.653s

$ time grep -Fcxv -f abc.txt mno.txt
... 0m23.920s

$ time grep -Fcwv -f abc.txt mno.txt
... 0m40.313s

$ time awk 'NR==FNR{a[$0]++};NR!=FNR && a[$0]' abc.txt  mno.txt | wc -l
... 0m12.161s

বাছাই হচ্ছে আমার বেশিরভাগ সময় নেয়। যদি আমরা ভেবে দেখি যে abc.txt স্থিতিশীল, আমরা এটি প্রাক-বাছাই করতে পারি এবং এটি ভবিষ্যতের তুলনা আরও দ্রুত করে তোলে:

$ sort abc.txt abc-sorted.txt
$ time comm -23 abc-sorted.txt <(sort mno.txt) | wc -l
... 0m7.426s

আপনি এগুলি দেখতে পারেন এবং কয়েক সেকেন্ড অপ্রাসঙ্গিক বিবেচনা করতে পারেন তবে আমি হাইলাইট করতে হবে যে এগুলি একটি উচ্চতর মেশিনে চলছে। আপনি যদি কোনও (উদাঃ) রাস্পবেরি পাই 3 এ করতে চান, আপনি খুব ধীরে ধীরে পরিবর্তন ঘুরে দেখবেন এবং পার্থক্যটি এমন এক পর্যায়ে বৃদ্ধি পাবে যা এটি গুরুত্বপূর্ণ।


7

একটি তালিকা পেতে:

grep -Fwf abc.txt mno.txt

এটি আপনাকে অনুরূপ কিছু দেয়:

abcd
abcd
zef

আপনি যদি কেবল একটি অনন্য তালিকা পেতে চান তবে এটি ব্যবহার করুন:

grep -Fwf abc.txt mno.txt | sort | uniq

এবং গণনা পেতে:

grep -Fcwv -f abc.txt mno.txt

  • -F অর্থ: PATTERN নিয়মিত এক্সপ্রেশনগুলির পরিবর্তে স্থির স্ট্রিংগুলির একটি তালিকা হিসাবে ব্যাখ্যা করুন।
  • -fফাইল হতে পারে যা নিদর্শন প্রাপ্ত abc.txt
  • আমরা mno.txtনিদর্শন জন্য সন্ধান
  • -c ম্যাচের সংখ্যা গণনা করুন
  • -wকেবলমাত্র "পুরো শব্দগুলি" সন্ধান করুন: মেলানো সাবস্ট্রিংটি অবশ্যই লাইনটির শুরুতে হওয়া উচিত, বা তার আগে কোনও শব্দহীন উপাদানযুক্ত চরিত্র দ্বারা। একইভাবে, এটি অবশ্যই লাইনের শেষে বা একটি অ-শব্দের উপাদান অক্ষর দ্বারা অনুসরণ করা উচিত। শব্দ-উপাদানযুক্ত অক্ষর হ'ল অক্ষর, অঙ্ক এবং আন্ডারস্কোর।
  • -v অনুসন্ধান বিপরীত

1
ওপি একটি চায় গণনা এর ম্যাচ, যে আরো ভালো করা উচিত হবে না grep -cxvFf abc.txt mno.txt?
স্টিল্ড্রাইভার

কেবল এটি দেখেছেন: ডি ... আমাকে বাঁচানোর জন্য আপনার এখানে সর্বদা: ডি
রাভেক্সিনা

এফওয়াইআই fgrep, egrepবিকল্পগুলি অনুমিতভাবে grep -Fgrep -E
অবহিত করা

এটি ব্যবহার করার -xসময় কি প্রয়োজনীয় -F?
রাভেক্সিনা

1
এটি ওপি ঠিক কী গণনা করতে চায় তা নির্ভর করে - উদাহরণস্বরূপ যদি mno.txt থাকে abcdefতবে সেই গণনাটি ম্যাচ হিসাবে বা একটি মিল না-করা উচিত abcd?
স্টিল্ড্রাইভার

3

আমরা প্রথমে প্যাটার্ন ফাইলটি, তারপরে যে ফাইলটি যাচাই করতে চাইছি তা দুটি ফাইল পাস করে কাজটি করতে আমরা awk ব্যবহার করতে পারি। আমরা যখন প্রথম ফাইলটি পড়ছি তখন আমরা তা জানি NR==FNRএবং সেই সময় আমরা অ্যারেতে লাইনগুলি পড়তে পারি। NR!=FNRআমরা যখন পরীক্ষা করি যে এই জাতীয় লাইনের জন্য অ্যারে সেট করা আছে কিনা।

$ cat abc.txt                                                      
abcd
xyz
pqrs
$ cat mno.txt                                                      
zzon
xyz
mkno
abcd
$ awk 'NR==FNR{a[$0]++};NR!=FNR && a[$0]' abc.txt  mno.txt         
xyz
abcd

বিপরীতভাবে, আমরা যে লাইনে নেই সেগুলি মুদ্রণের জন্য প্যাটার্নটিকে অস্বীকার করতে পারি abc.txt

$ awk 'NR==FNR{a[$0]++};NR!=FNR && ! a[$0]' abc.txt  mno.txt       
zzon
mkno

এবং আমরা যদি নিয়োগ করতে পারি তবে তাদের গণনা মুদ্রণ করতে চাই sortএবং wc:

$ awk 'NR==FNR{a[$0]++};NR!=FNR && ! a[$0]' abc.txt  mno.txt | sort -u | wc -l         
2

আমার মনে হয় আপনার চারপাশে এটি ভুল উপায়ে আছে। যতদূর আমি প্রশ্নটি বুঝতে, অপ সেট পার্থক্য (এর সাইজ) নিরূপণ করতে চায় abc.txt- mno.txtযা {xyz, pqrs}
ডেভিড ফোস্টার 13

2

শব্দের তালিকাগুলির মধ্যে যদি দুটিরই অমীমাংসিত হয় তবে সাধারণ শব্দগুলি মনে রাখার জন্য একটি দক্ষ সেট ডেটা কাঠামো ব্যবহার করা আরও দ্রুত।

পাইথন

#!/usr/bin/env python3
import sys

with open(sys.argv[1]) as minuend_file:
    minuend = frozenset(map(str.rstrip, minuend_file))
with open(sys.argv[2]) as subtrahend_file:
    subtrahend = frozenset(map(str.rstrip, subtrahend_file))

difference = minuend - subtrahend
#print(*difference, sep='\n') # This prints the content of the set difference
print(len(difference)) # This prints the magnitude of the set difference

ব্যবহার:

python3 set-difference.py abc.txt mno.txt

পাইথন (আরও দক্ষ)

আপনি যদি মধ্যস্থতাকারী স্টোরেজ এবং রান সময়ের জন্য কিছুটা স্মৃতি সঞ্চয় করতে চান তবে প্রোগ্রামটি বুঝতে এটি আরও কিছুটা কঠিন ব্যবহার করতে পারেন:

#!/usr/bin/env python3
import sys

with open(sys.argv[1]) as minuend_file:
    minuend = set(map(str.rstrip, minuend_file))
with open(sys.argv[2]) as subtrahend_file:
    subtrahend = map(str.rstrip, subtrahend_file)
    minuend.difference_update(subtrahend)
    difference = minuend
    del minuend

#print(*difference, sep='\n') # This prints the content of the set difference
print(len(difference)) # This prints the magnitude of the set difference

কর্মক্ষমতা

দেওয়া হয়েছে abc.txtএবং mno.txt10 টি এলোমেলো ASCII ডিজিট অক্ষরের 1 টি মিও অরসেটেড লাইন সহ (সেটআপের জন্য অলির উত্তর দেখুন):

$ time python3 set-difference.py abc.txt mno.txt
user    0m10.453s

বনাম

$ export LC_COLLATE=C
$ time sort abc.txt > abc_sorted.txt
user    0m10.652s
$ time sort mno.txt > mno_sorted.txt
user    0m10.767s
$ time comm -23 abc_sorted.txt mno_sorted.txt | wc -l
9989882
user    0m1.600s

মোট: 23 সেকেন্ড

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