ডনের বেশিরভাগ ক্ষেত্রেই ভালো হতে পারে, কিন্তু ধরো যদি ফাইল সত্যিই বড়, এবং আপনি পাবেন না sedএকটি স্ক্রিপ্ট ফাইল বড় যে হ্যান্ডেল করতে (যা স্ক্রিপ্ট প্রায় 5000+ টি লাইন ঘটতে পারে) , এখানে এটা প্লেইন সাথে আছেন sed:
sed -ne:t -e"/\n.*$match/D" \
-e'$!N;//D;/'"$match/{" \
-e"s/\n/&/$A;t" \
-e'$q;bt' -e\} \
-e's/\n/&/'"$B;tP" \
-e'$!bt' -e:P -e'P;D'
এটি ইনপুটটিতে স্লাইডিং উইন্ডো যাকে বলা হয় তার একটি উদাহরণ । এটি কোনও কিছু মুদ্রণের চেষ্টা করার আগে - অ্যাকাউন্টের লাইনগুলির চেহারা-এগিয়ে বাফার তৈরি করে কাজ করে $B।
এবং প্রকৃতপক্ষে, সম্ভবত আমার আমার পূর্ববর্তী বিষয়টি স্পষ্ট করা উচিত: এই সমাধান এবং ডনের উভয়ের জন্য প্রাথমিক পারফরম্যান্স সীমাবদ্ধতা সরাসরি বিরতির সাথে সম্পর্কিত হবে। এই সমাধান বৃহত্তর ব্যবধান সঙ্গে মন্থর করে দেবে মাপ , যেহেতু ডনের বড় ব্যবধান সঙ্গে মন্থর করে দেবে ফ্রিকোয়েন্সি । অন্য কথায়, এমনকি যদি ইনপুট ফাইলটি খুব বড় হয় তবে প্রকৃত বিরতি ঘটনা যদি এখনও খুব কম হয় তবে তার সমাধান সম্ভবত যাওয়ার উপায়। তবে, যদি অন্তর আকারটি তুলনামূলকভাবে পরিচালনাযোগ্য হয় এবং প্রায়শই ঘটে যাওয়ার সম্ভাবনা থাকে, তবে এটি আপনার বেছে নেওয়া উচিত সমাধান।
সুতরাং ওয়ার্কফ্লো এখানে:
- যদি
$matchকোনও ই- \nলাইন এর আগে প্যাটার্ন স্পেসে পাওয়া যায় তবে এর আগে প্রতিটি ইওলাইন sedপুনরাবৃত্তভাবে একাদশ করতে হবে।
D\n
- আমি
$matchএর পূর্বে সম্পূর্ণরূপে প্যাটার্নের জায়গাটি সাফ করে দিচ্ছিলাম - তবে সহজেই ওভারল্যাপটি পরিচালনা করতে, একটি ল্যান্ডমার্ক রেখে আরও ভাল কাজ করবে বলে মনে হয়।
- আমি এটি একবারে
s/.*\n.*\($match\)/\1/পেতে এবং লুপটি ডজ করার চেষ্টা করার চেষ্টাও করেছি , তবে যখন $A/$Bবড় হয়, তখন Dএলেটের লুপটি যথেষ্ট দ্রুত প্রমাণিত হয়।
- তারপর আমরা টেনে
Nএকটি পূর্বে ইনপুটের EXT লাইন \newline বিভেদক এবং আবার চেষ্টা করুন Dএকটি elete /\n.*$match/আমাদের অতি সম্প্রতি যেটি ব্যবহার রেগুলার এক্সপ্রেশন W / বিষয়ে উল্লেখ করে আবার //।
- যদি প্যাটার্ন স্পেসের সাথে মেলে
$matchতবে এটি কেবলমাত্র লাইনের শিরোনামে এটি করতে পারে $match- সমস্ত $Bইওরোফর লাইন সাফ হয়ে গেছে।
- সুতরাং আমরা
$After উপর লুপিং শুরু ।
- এই
s///লুপটির প্রতিটি রান আমরা প্যাটার্ন স্পেসের &নিজস্ব $Aই- \nলাইন চরিত্রটি নিজের জন্য বদলে নেওয়ার চেষ্টা করব এবং সফল হলে এটি tআমাদের শাখা করে দেবে - এবং আমাদের পুরো $Aঅবধি বাফার - পুরোপুরি স্ক্রিপ্টটি উপরের দিক থেকে শুরু করার জন্য পুরোপুরি বাইরে out যদি হয় তবে পরবর্তী ইনপুট লাইন দিয়ে।
- যদি
tএস্টটি সফল না হয় তবে আমরা bআবার :tওপ লেবেলটিতে ফিরে যাব এবং ইনপুটটির অন্য লাইনটির জন্য পুনরাবৃত্তি করবো - সম্ভবত আরও $matchকিছুটা জড়ো হওয়ার সময় লুপটি শুরু হবে $A।
- আমরা যদি অতীত একটি পেতে
$matchফাংশন লুপ, তাহলে আমরা চেষ্টা করব pদ্রণ $শেষ লাইনটি যদি এই তা না হয়, আর যদি !চেষ্টা করবেন s///জন্য ubstitute &নিজেই $Bতম \nপ্যাটার্ন স্থান ewline অক্ষর।
- আমরা
tএটিও করব এবং এটি সফল হলে আমরা :Pরিন্ট লেবেলে শাখা করব ।
- যদি না হয় তবে আমরা ফিরে শাখা করব
:tএবং বাফারে আর একটি ইনপুট লাইন যুক্ত করব।
- আমরা যদি করতে এটি
:Pদ্রণ আমরা করব Pতারপর দ্রণ Dপ্রথম পর্যন্ত elete \nপ্যাটার্ন স্থান ewline দিলে যা থাকে সঙ্গে উপর থেকে স্ক্রিপ্ট পুনরায় আরম্ভ করুন।
এবং তাই এই সময়, যদি আমরা করছিলাম A=2 B=2 match=5; seq 5 | sed...
:Pরিন্টে প্রথম পুনরাবৃত্তির জন্য প্যাটার্ন স্পেসটি দেখতে পাবেন:
^1\n2\n3$
এবং এইভাবে এটি এর sedপূর্বের $Bবাফার সংগ্রহ করে । এবং সুতরাং এটি সংগ্রহ করা ইনপুট পিছনেsed আউটপুট- $Bঅ্যাকাউন্টিং লাইনগুলিতে মুদ্রণ করে । এর অর্থ এই যে, আমাদের পূর্ববর্তী উদাহরণ দেওয়া হবে দ্রণ আউটপুট, এবং তারপর elete এবং একটি প্যাটার্ন স্থান যা দেখে মনে হচ্ছে স্ক্রিপ্ট উপরের ফেরত পাঠাতে:sedP1D
^2\n3$
... এবং স্ক্রিপ্টের শীর্ষে Nএক্সপুট ইনপুট লাইনটি পুনরুদ্ধার করা হয়েছে এবং তাই পরবর্তী পুনরাবৃত্তিটি দেখে মনে হচ্ছে:
^2\n3\n4$
এবং তাই আমরা যখন ইনপুটটির প্রথম উপস্থিতিটি পাই 5, তখন প্যাটার্ন স্পেসটি আসলে দেখতে দেখতে:
^3\n4\n5$
তারপরে Dএকাদশ লুপটি লাথি মারে এবং এটির মাধ্যমে এটি দেখতে মনে হয়:
^5$
এবং যখন Nএক্সট্রা ইনপুট লাইনটি টানা হয় তখন ইওএফ sedহিট হয় এবং প্রস্থান করে। ততক্ষণে এটি কেবলমাত্র P1 এবং 2 এর লাইনটি ছড়িয়ে দিয়েছে ।
এখানে একটি উদাহরণ রান করুন:
A=8 B=7 match='[24689]0'
seq 100 |
sed -ne:t -e"/\n.*$match/D" \
-e'$!N;//D;/'"$match/{" \
-e"s/\n/&/$A;t" \
-e'$q;bt' -e\} \
-e's/\n/&/'"$B;tP" \
-e'$!bt' -e:P -e'P;D'
যে মুদ্রণ:
1
2
3
4
5
6
7
8
9
10
11
12
29
30
31
32
49
50
51
52
69
70
71
72
99
100