দক্ষতার সাথে সাজানো ফাইল অনুসন্ধান করুন


12

আমার কাছে প্রতিটি লাইনে একটি স্ট্রিং যুক্ত একটি বড় ফাইল রয়েছে। আমি ফাইলটিতে স্ট্রিং রয়েছে কিনা তা দ্রুত নির্ধারণ করতে সক্ষম হতে চাই। আদর্শভাবে, এটি একটি বাইনারি চপ টাইপ অ্যালগরিদম ব্যবহার করে করা হবে।

কিছু গুগলিং পতাকাটির lookসাথে কমান্ডটি প্রকাশ করেছিল -bযা বাইনারি অনুসন্ধান অ্যালগরিদম ব্যবহার করে প্রদত্ত উপসর্গ দিয়ে শুরু করে সমস্ত স্ট্রিং সনাক্ত এবং আউটপুট দেওয়ার প্রতিশ্রুতি দেয়। দুর্ভাগ্যক্রমে, এটি সঠিকভাবে কাজ করছে বলে মনে হচ্ছে না এবং ফাইলগুলিতে থাকা স্ট্রিংগুলির নালীর ফলাফল দেয় (এগুলি সঠিকভাবে সমতুল্য grepঅনুসন্ধানে ফিরে আসে )।

এই ফাইলটি দক্ষতার সাথে অনুসন্ধানের জন্য কি অন্য কোনও ইউটিলিটি বা কৌশল সম্পর্কে জানেন?


উপরের উত্তরটি ভুল বাছাইয়ের কথা জানিয়েছে: lookকমান্ডটি সঠিকভাবে কাজ করতে LC_COLLATE = C সাজানো -d এটিকে সত্য হিসাবে সাজানো দরকার কারণ চেহারাটি লোকেলকে উপেক্ষা করার মত মনে হয় এবং হার্ডকডযুক্ত বাছাইয়ের মতো সি ব্যবহার করে, আমি একটি বাগও খুললাম এই বিভ্রান্তিকর আচরণের কারণে: bugzilla.kernel.org/show_bug.cgi?id=198011
সুর ​​3

look -bএকটি ত্রুটি সঙ্গে আমার জন্য ব্যর্থ File too large। আমি মনে করি এটি পুরো জিনিসটি মেমোরিতে পড়ার চেষ্টা করছে।
ব্রায়ান মিন্টন

উত্তর:


9

তার মাঝে একটি অপরিহার্য পার্থক্য grepএবং look:

অন্যথায় স্পষ্টভাবে বিবরণ না দেওয়া grepপর্যন্ত লাইনগুলির মধ্যে কোথাও নিদর্শনগুলি খুঁজে পাবেন। জন্য lookর manpage পদ বলে:

বর্ণন - প্রদত্ত স্ট্রিং দিয়ে শুরু লাইন প্রদর্শন করুন

আমি lookখুব ঘন ঘন ব্যবহার করছি না , তবে এটি কেবলমাত্র চেষ্টা করা একটি তুচ্ছ উদাহরণের সাথে ভাল কাজ করেছে।


1
আমার যে ফাইলটি অনুসন্ধান করতে হবে তার প্রায় 110,000,000 লাইন রয়েছে। আমি যদি করি তবে egrep "^TEST" sortedlist.txt | wc -l আমি 41,289 ফলাফল পাচ্ছি। তবে সমতুল্য lookআদেশ, look -b TEST sortedlist.txt | wc -lকেবল 1995 ফলাফল দেয়। আমি প্রায় আশ্চর্য হয়েছি যে কোনও বাগ আছে কিনা look
ম্যাট

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

4

একটু দেরিতে উত্তর:

Sgrep আপনাকে সাহায্য করবে।

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

  • সমস্ত ইনপুট ফাইল অবশ্যই নিয়মিত ফাইল বাছাই করতে হবে।
  • বাছাই কীটি অবশ্যই লাইনের শুরুতে শুরু হওয়া উচিত।
  • অনুসন্ধান কীটি কেবল লাইনের শুরুতে মেলে matches
  • কোনও নিয়মিত প্রকাশের সমর্থন নেই।

আপনি উত্সটি এখানে ডাউনলোড করতে পারেন: https://sourceforge.net/projects/sgrep/?source=typ_redirect

এবং দস্তাবেজগুলি এখানে: http://sgrep.sourceforge.net/

অন্য উপায়:

ফাইলটি কত বড় তা আমি জানি না ayআপনি সমান্তরাল চেষ্টা করতে পারেন:

/programming/9066609/fastest-possible-grep

আমি সর্বদা ফাইলগুলির সাথে গ্রেপ করি যা আকার> 100 জিবি, এটি ভালভাবে কাজ করে।



হ্যাঁ, আমি ডাউনলোড লিঙ্কটি পূরণ করি ...
মেমোরিবক্স

যদি তা হয় তবে নতুন উত্তর পোস্ট করার পরিবর্তে আপনার সেই পোস্টটি সম্পাদনা করা উচিত ।
মুড়ু

সেই পোস্টটি সুপারিশ করা হয়েছে: sudo apt-get install sgrep স্যাগ্রেপ পেতে, বুন্টু রিপোজিটরিগুলিতে থাকা স্যাগ্রিপ আসলে এই স্যাজরেপ নয়, আমি নিশ্চিত নই যে এটি একই জিনিস।
মেমোরিবক্স

0

আপনি ফাইলটি টুকরো টুকরো করে টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো করতে পারেন:

for line in $(cat /usr/share/dict/american-english | tr '[:upper:]' '[:lower:]' | sort | uniq)
do
    prefix=$(echo $line | md5sum - | cut -c 1-2)
    mkdir -p $prefix
    echo $line | gzip >> $prefix/subwords
done

তারপরে চেহারাটি দেখতে কেমন হবে:

    prefix=$(echo $word | md5sum - | cut -c 1-2)
    zgrep -m 1 -w word $prefix/subwords

এটি দুটি কাজ করে:

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

0

এসাগ্রেপ আপনার জন্য কাজ করতে পারে:

sudo apt-get install sgrep
sgrep -l '"needle"' haystack.txt

প্রকল্প পৃষ্ঠাটি http://sgrep.sourceforge.net/ বলছে:

এসগ্রেপ বাইনারি অনুসন্ধান অ্যালগরিদম ব্যবহার করে যা খুব দ্রুত, তবে বাছাই করা ইনপুট প্রয়োজন requires

সন্নিবেশের জন্য, আমি মনে করি একটি ডাটাবেস ব্যবহার করার চেয়ে ভাল সমাধান আর নেই: /programming/10658380/shell-one-liner-to-add-a-line-to-a-sorted-file/ 33859372 # 33859372


3
sgrepউবুন্টু সংগ্রহস্থলগুলিতে আসলে এই sgrep , যা "একটি কাঠামোবদ্ধ প্যাটার্ন জন্য একটি ফাইল অনুসন্ধান" করার জন্য ডিজাইন করা ও বাইনারি অনুসন্ধান সঙ্গে কিছুই করার রয়েছে।
ingomueller.net

0

আপনি যদি এটি সত্যিই দ্রুত চান (ও (1) দ্রুত) আপনি এটি দেখতে একটি হ্যাশ সেট তৈরি করতে পারেন। আমি এমন কোনও প্রয়োগ খুঁজে পাইনি যা আমাকে কোনও ফাইলের মধ্যে প্রাক-বিল্ট হ্যাশ সেটটি সংরক্ষণ করতে দেয় এবং পুরো ফাইলটি মেমরির মধ্যে না পড়েই এটি তদন্ত করতে দেয়, তাই আমি আমার নিজেরটি ঘূর্ণিত করি

হ্যাশ সেট তৈরি করুন ( -b/ --build):

./hashset.py --build string-list.txt strings.pyhashset

হ্যাশ সেটটি অনুসন্ধান করুন ( -p/ --probe):

./hashset.py --probe strings.pyhashset \
    'Is this string in my string list?' 'What about this one?'

… বা স্ট্র্যান্ড সহ স্ট্যান্ডার্ড ইনপুটটিতে সন্ধান করুন:

printf '%s\n' 'Is this string in my string list?' 'What about this one?' |
./hashset.py --probe strings.pyhashset

আপনি আউটপুট শান্ত করতে --probeসঙ্গে -q/ --quietবিকল্প আপনি শুধুমাত্র প্রস্থান অবস্থা প্রতি আগ্রহ দেখিয়েছেন:

if ./hashset.py --quiet --probe strings.pyhashset ...; then
    echo 'Found'
else
    echo 'Not found'
fi

আরও বিকল্পের জন্য -h/ --helpঅপশন বা তার সাথে থাকা READMEফাইলের মাধ্যমে ব্যবহারের বিবরণ অ্যাক্সেসযোগ্য দেখুন ।

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