আপনি বর্তমান ডিরেক্টরিতে সমস্ত ফাইলের মধ্যে কোনও পদটির প্রতিটি সংখ্যাকে কীভাবে গণনা করবেন?


10

আপনি বর্তমান ডিরেক্টরিতে সমস্ত ফাইলের মধ্যে কোনও পদটির প্রতিটি সংখ্যাকে কীভাবে গণনা করবেন? - এবং উপ-ডিরেক্টরি (?)

আমি পড়েছি যে এটি করার জন্য আপনি ব্যবহার করবেন grep; সঠিক আদেশ কি?

এছাড়াও, উপরের কিছু অন্য কমান্ড দ্বারা এটি সম্ভব?

উত্তর:


12

grep+ ব্যবহার করে wc(এটি একই লাইনে পদটির একাধিক উপস্থিতি পূরণ করবে):

grep -rFo foo | wc -l
  • -rইন grep: বর্তমান ডিরেক্টরি শ্রেণিবিন্যাসে পুনরাবৃত্তি অনুসন্ধান করে;
  • -Fইন grep: কোনও প্যাটার্নের পরিবর্তে স্থির স্ট্রিংয়ের বিরুদ্ধে ম্যাচগুলি;
  • -oইন grep: প্রিন্টগুলি কেবল মিলছে;
  • -lইন wc: লাইনের গণনা প্রিন্ট করে;
% tree                 
.
├── dir
│   └── file2
└── file1

1 directory, 2 files
% cat file1 
line1 foo foo
line2 foo
line3 foo
% cat dir/file2 
line1 foo foo
line2 foo
line3 foo
% grep -rFo foo | wc -l
8

আমি মনে করি সবচেয়ে ভাল।
জ্যাকব Vlijm

1
@ জ্যাকবভিলিজম ধন্যবাদ! আমি আপনারও পছন্দ করি (এবং এটি ইতিমধ্যে upvated)
কোস

আমি মনে করি PCREsযেহেতু তারা পরীক্ষামূলক
এডওয়ার্ড টরভাল্ডস

2
পিসিআরইগুলি "পরীক্ষামূলক" নয়, তবে সেগুলি সবসময় গ্রেপ-তে সংকলিত হয় না (এজন্য যখন আমি যখন প্রয়োজন তখন পিসিগ্রিপ ব্যবহার করি)। এই ক্ষেত্রে, তারা অপ্রয়োজনীয়, যেহেতু প্রশ্নটি একটি "শব্দ" সম্পর্কে জিজ্ঞাসা করে যা সম্ভবত একটি নির্দিষ্ট স্ট্রিং, কোনও ধরণের প্যাটার্ন নয়। সুতরাং, -Fসম্ভবত দ্রুত হতে হবে।
dannysauer

2
@ এডানিসাউয়ার আমি পিসিআরই ব্যবহার করেছি কারণ কিছু (ভুল) কারণে আমি ভেবেছিলাম তাদের একই লাইনে একাধিক উপস্থিতি মিলে যাওয়ার দরকার ছিল, তবে বাস্তবে তারা তা নয়। আমি -Fপরিবর্তে ব্যবহার করার চেষ্টা করিনি -P। দুর্দান্ত পরামর্শের জন্য ধন্যবাদ, ব্যবহার করে আপডেট করা -F, যা এখানে প্রকৃতপক্ষে আরও ভাল ফিট করে।
kos

8

grep -Rc [term] *এটা করবে। -Rপতাকা মানে আপনি recursively বর্তমান ডিরেক্টরি ও তার সাব সব অনুসন্ধান করতে চান। *সব ফাইল: একটি ফাইল নির্বাচক অর্থ। -cপতাকা তোলে grepআউটপুট শুধুমাত্র ঘটনার সংখ্যা। তবে, শব্দটি যদি একটি লাইনে একাধিকবার ঘটে তবে এটি একবারে গণনা করা হয়।

থেকে man grep:

  -r, --recursive
          Read all files under each directory, recursively, following symbolic links only if they are on the command line.
          This is equivalent to the -d recurse option.

   -R, --dereference-recursive
          Read all files under each directory, recursively.  Follow all symbolic links, unlike -r.

আপনার ডিরেক্টরিতে যদি কোনও প্রতীকী লিঙ্ক না থাকে তবে কোনও পার্থক্য নেই।


আপনি -cপতাকাটি যুক্ত করতে পারেন grep। তারপর, grep গন্য নিজেই এবং আপনার প্রয়োজন হবে নাwc
Wayne_Yux

আপনি --আগে রাখতে চান*
এডওয়ার্ড টরভাল্ডস

2
এটি কেবল *নন-ডটফাইলগুলিতে প্রসারিত হবে, সুতরাং আপনি সেগুলি মিস করেন। এটি কেবল "" ব্যবহার করা আরও বেশি অর্থবোধ করে। যেহেতু আপনার'ই তবুও পুনরাবৃত্তিমূলকভাবে তর্কগুলি প্রক্রিয়া করতে যাচ্ছেন - এবং এটি ডট ফাইলগুলি পাবে। এখানে সবচেয়ে বড় সমস্যাটি হ'ল এটি কোনও শব্দের সংখ্যার সংখ্যার চেয়ে লাইন সংখ্যাটি করতে পারে। শব্দটি যদি এক লাইনে একাধিকবার প্রদর্শিত হয়, তবে এটি কেবল একবার "
গ্রেপ-

2

একটি ছোট অজগর লিপি:

#!/usr/bin/env python3
import os
import sys

s = sys.argv[1]
n = 0
for root, dirs, files in os.walk(os.getcwd()):
    for f in files:
        f = root+"/"+f      
        try:
            n = n + open(f).read().count(s)
        except:
            pass
print(n)
  • এটি হিসাবে সংরক্ষণ করুন count_string.py
  • কমান্ড দিয়ে ডিরেক্টরি থেকে এটি চালান :

    python3 /path/to/count_string.py <term>
    

মন্তব্য

  • শব্দটি শূন্যস্থান অন্তর্ভুক্ত থাকলে, উদ্ধৃতি ব্যবহার করুন।
  • এটি শব্দটির প্রতিটি ঘটনাকে পুনরাবৃত্তভাবে গণনা করে, এমনকি যদি এক লাইনে একাধিক উপস্থিতি ঘটে।

ব্যাখ্যা:

# get the current working directory
currdir = os.getcwd()
# get the term as argument
s = sys.argv[1]
# count occurrences, set start to 0 
n = 0
# use os.walk() to read recursively
for root, dirs, files in os.walk(currdir):
    for f in files:
        # join the path(s) above the file and the file itself
        f = root+"/"+f
        # try to read the file (will fail if the file is unreadable for some reason)
        try:
            # add the number of found occurrences of <term> in the file
            n = n + open(f).read().count(s)
        except:
            pass
print(n)

2
অজগর লোক ;) +1
বলুন

1
বিটিডব্লিউ কি rootএবং এর fজন্য?
টেলমেয়ে কেন

1
rootবর্তমান ডিরেক্টরিটি "উপরে" অন্তর্ভুক্ত ফাইলের পথ, fসেই ফাইল। বিকল্পভাবে, os.path.join()ব্যবহার করা যেতে পারে, তবে আরও ভার্জোজ।
জ্যাকব Vlijm

1
আর n = n + open(f).read().count(s)?
15

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

2

@ কোসের দুর্দান্ত উত্তরের একটি রূপ হিসাবে আপনি যদি গণনাগুলিকে আইটেমাইজ করতে আগ্রহী হন তবে আপনি -cঘটনাগুলি গণনা করতে গ্রেপের সুইচ ব্যবহার করতে পারেন :

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