বাশ: কয়েকটি বর্ণানুক্রমিক অর্ডার করা ফাইলের মধ্যে এন অক্ষর গণনা করুন


1

আমি একজন প্রুফ-রিডার নিয়ে কাজ করি যার প্রতি আমি প্রতিটি এন অক্ষর (500000 এর মতো) হিসাবে নির্দিষ্ট পরিমাণ অর্থ প্রদান করি। তিনি (সাধারণত) বর্ণানুক্রমিকভাবে ফাইলগুলি তৈরি / সম্পাদনা করেন। সামগ্রী / ফাইলের নামগুলি (ল্যাটিনবিহীন) utf-8 এ রয়েছে। সাধারণ সরল পাঠ্য মার্কডাউন (.md) বা org (.org) ফাইল।

নিজের জন্য তার "এন অক্ষরগুলির মাইলফলক" নোট করার জন্য আমার একটি কার্যকর উপায় খুঁজে বের করা উচিত, যাতে আমি জানি যে তাকে কখন অর্থ দিতে হবে। উদাহরণস্বরূপ, ধরা যাক যে আমি তাকে শেষ বার "aab.md" ফাইলের 3036 অক্ষর অবধি প্রদান করেছি। তিনি সেই ফাইলটি শেষ করেছেন, "aac.md", "aad.md" নিয়ে যান এবং এখন "csdw.md" এ আছেন।

  1. আমি কীভাবে এন অক্ষরগুলিকে "পরিমাপ" করতে পারি (অন্তর্ভুক্ত সমস্ত কিছুই: বিরামচিহ্ন, ফাঁকা স্থান, অঙ্ক, নিউলাইনস, ধনুর্বন্ধনী ইত্যাদি) সেই স্ট্রিমের মধ্যে (এই সমস্তটি একই ডিরেক্টরিতে রয়েছে বলে ধরে নেওয়া)? অর্থাৎ আমার একটি বাশ কমান্ডের দরকার যা "aab.md", 3036, এবং N ইনপুট হিসাবে পেয়ে যাবে এবং এর মতো কিছু সরবরাহ করবে: "csaw.md", 5023 (যার অর্থ N অক্ষর সেই সঠিক অক্ষরে সেই ফাইলটিতে শেষ হয়েছিল)।
  2. আগের কমান্ডের জন্য যে ফাইলগুলি অ্যাকাউন্ট করা হয়েছিল আমি কীভাবে সেগুলি তালিকাভুক্ত করতে পারি?
  3. এটি কম গুরুত্বপূর্ণ, তবে সম্ভব হলে - # 1 থেকে কমান্ডটি কেমন হবে, যদি ফাইলগুলি বেশ কয়েকটি ডিরেক্টরিতে ছড়িয়ে পড়ে (বর্ণানুক্রমিক ক্রমেও), যেমন তিনি "আ / আব" ফাইলের 3036 অক্ষরটিতে শেষবার থামিয়েছিলেন। এমডি "এবং এখন" এনপি / সিএসডিডব.এমডি "এ আছেন?

আমি বুঝতে পেরেছি যে cat * | wc -mসমস্ত ফাইলগুলিতে পরিমাণের পরিমাণ সরবরাহ করতে পারে তবে এটি আমার প্রয়োজন থেকে এখনও অনেক দূরে।


আপনি কি কোনও অক্ষর (বিরামচিহ্ন, ফাঁকা স্থান, অঙ্ক, মার্কডাউন ফর্ম্যাটিং সহ) বা কেবল বর্ণানুক্রমিককে গণনা করতে চান? 5023 ফাইলের মধ্যে বাইট, অক্ষরে বা বর্ণমালা অক্ষরে অফসেট? একাধিক অক্ষর ব্যবহার করে (যেমন ইউনিকোডের অক্ষর ব্যবহার করে এমন) গ্রাফিমগুলি সম্পর্কে কী বলা যায়?
স্টাফেন চেজেলাস

@ স্টাফেনচাজেলাস, আমার প্রশ্নকে আপডেট করেছে: সবকিছু অন্তর্ভুক্ত: বিরামচিহ্ন, ফাঁকা স্থান, অঙ্ক, নিউলাইনস, ধনুর্বন্ধনী ইত্যাদি কোনও গ্রাফিক্স mes 5023 অফসেটটি কোনও অক্ষরে (উপরে হিসাবে) রয়েছে।
ব্যবহারকারী 1876484

উত্তর:


3

আমি zshপরিবর্তে ব্যবহার করার পরামর্শ দিচ্ছি bash, যেহেতু নতুন ফাইলগুলির একটি বাছাই করা পুনরাবৃত্ত তালিকা পেতে এটি আরও সহজ করে তুলছে aab.md

#! /bin/zsh -
last_file=aab.md offset_in_last_file=3036 n=500000
new_files=(**/*.(md|org)(N))
new_files=($new_files[(Re)$last_file,-1])

(($#new_files)) && perl -Ci -sne '
   $l = length; $go += $l; $o += $l;
   if ($go >= $n) {
     printf qq(file="%s", line=%d, char-offset=%d\n), $ARGV, $., $o + $n - $go;
     exit;
   }
   $o = 0 if eof' -- -go=-$offset_in_last_file -n=$n ./$^new_files

অক্ষরের পরিবর্তে গ্রাফিম ক্লাস্টার সংখ্যার জন্য, প্রতিস্থাপন $l = lengthসঙ্গে $l = () = /\X/g। উদাহরণস্বরূপ éলিখিতভাবে U+0065U+0301দুটি গ্রাফিক (এবং ইউটিএফ -8-তে 3 বাইট) সহ প্রকাশিত এক গ্রাফিম ক্লাস্টার হিসাবে লেখা হয় , যখন এটি ইউ গ্রাহীকরণের ক্লাস্টার এবং একটি অক্ষর (এবং 2 বাইট) থাকে যখন ইউ + 00E9 হিসাবে লেখা হয়।

4.4+ বাশ এবং জিএনইউ দিয়ে awkআপনি $new_filesঅ্যারে তৈরির জন্য অনুরূপ কিছু করতে পারেন

shopt -s nullglob extglob globstar
readarray -td '' new_files < <(
    printf '%s\0' **/*.@(md|org) |
      L=$last_file awk -v RS='\0' -v ORS='\0' '$0 == ENVIRON["L"], 0'
  )

সঙ্গে bash, এছাড়াও আপনি প্রতিস্থাপন করা প্রয়োজন চাই ./$^new_filesসঙ্গে "${new_files[@]/#/.\/}"। (আমরা একটি যোগ করছি ./উপসর্গ দিয়ে শুরু ফাইলের নাম দিয়ে isssues এড়াতে -বা |, <, >, হোয়াইটস্পেস ...


ইনপুট হিসাবে আমি "aab.md" কোথায় প্রবেশ করব? এটি ডিরেক্টরিতে প্রথম ফাইল নাও হতে পারে। আমি ইতিমধ্যে বেশ কয়েকবার তাকে অর্থ প্রদানের পরে এই ফাইল হতে পারে ...
ব্যবহারকারীর 1876484

@ ব্যবহারকারী 1876484 ./*.@(md|org) হ'ল বর্তমান ডিরেক্টরিতে ফাইলগুলির তালিকা .mdএবং .orgফাইলগুলির মধ্যে প্রথমটি বোঝানো হয়েছে যে তিনি ইতিমধ্যে কাজ করেছেন এমন ফাইলগুলি (যারা আমাদের অনুসন্ধানকে অফসেট করে এমন 3030 টি অক্ষর)।
স্টাফেন চেজেলাস

আমাকে গণনার জন্য স্টার্ট পয়েন্ট হিসাবে ডিরেক্টরিতে কোনও ফাইল নির্দিষ্ট করতে সক্ষম করতে হবে (ফাইলের নাম + অফসেট), অন্যথায় আমাকে প্রতিবার ডিরেক্টরিতে ফাইলগুলি পুনরায় সাজানো দরকার যে আমি তাকে দিতে হবে কিনা তা যাচাই করার চেষ্টা করব, যা আমি করি না ' টি করতে চান না (এটি একটি গিটার সংগ্রহস্থল)।
ব্যবহারকারী 1876484

যদি 3036তিনি সর্বশেষ ফাইলটি শেষ বার সংশোধন করেছিলেন এবং যদি তিনি অতীতে লিখেছেন এমন মোট অক্ষরের সংখ্যা নয়, তবে পরিবর্তে ./*.@(md|org)সেই শেষ-সংশোধিত ফাইলটির সাথে শুরু হওয়া ফাইলগুলির তালিকা দিন।
স্টাফেন চেজেলাস

কিভাবে? [আব্ব .. "এবং উপরের দিকে"] একটি রেইজেক্স অর্থ আছে? @ (এমডি | org)?
ব্যবহারকারী 1876484
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.