সুতরাং, সাধারণভাবে, আমি sed
টেক্সট প্রসেসিংয়ের দিকে ঝুঁকছি - বিশেষত বড় ফাইলগুলির জন্য - এবং সাধারণত শেল নিজেই এই ধরণের জিনিসগুলি এড়ানো যায় না।
আমি মনে করি, যদিও এটি পরিবর্তন হতে পারে। আমি কাছাকাছি ছিল man ksh
এবং আমি এটি লক্ষ্য:
<#pattern Seeks forward to the beginning of the
next line containing pattern.
<##pattern The same as <# except that the por‐
tion of the file that is skipped is
copied to standard output.
বাস্তব-জগতের উপযোগিতা সম্পর্কে সন্দেহজনক, আমি এটি চেষ্টা করার সিদ্ধান্ত নিয়েছি। আমি করেছিলাম:
seq -s'foo bar
' 1000000 >file
... এমন এক মিলিয়ন লাইনের ডেটার জন্য যা দেখতে:
1foo bar
...
999999foo bar
1000000
... এবং এটিকে sed
পছন্দ করার মতো করে দিয়েছে:
p='^[^0-8]99999.*bar'
for c in "sed '/$p/q'" "ksh -c ':<##@(~(E)$p)'"
do </tmp/file eval "time ( $c )"
done | wc -l
সুতরাং উভয় কমান্ডই 999999foo বার পর্যন্ত উঠা উচিত এবং তাদের প্যাটার্নের সাথে মেলে এমন প্রয়োগের জন্য প্রতিটি লাইনের কমপক্ষে শুরু এবং শেষের মূল্যায়ন করতে হবে। এগুলি অবহেলিত প্যাটার্নের বিপরীতে প্রথম চরটিও যাচাই করতে হবে। এটি একটি সাধারণ জিনিস, তবে ... ফলাফলগুলি আমার প্রত্যাশা মতো ছিল না:
( sed '/^[^0-8]99999.*bar/q' ) \
0.40s user 0.01s system 99% cpu 0.419 total
( ksh -c ':<##@(~(E)^[^0-8]99999.*bar)' ) \
0.02s user 0.01s system 91% cpu 0.033 total
1999997
ksh
এখানে আগে এবং sed
একটি BRE ব্যবহার করে। আমি একই জিনিসটি ksh
আগে এবং একটি শেল প্যাটার্ন দিয়েছিলাম তবে ফলাফলগুলি পৃথক হয়নি।
যাইহোক, এটি মোটামুটি উল্লেখযোগ্য তাত্পর্য - 10 বার ksh
ছাড়িয়ে গেছে sed
। আমি এর আগে পড়েছি যে ডেভিড কর্ন তার নিজের আইও লিব লিখেছিলেন এবং এতে প্রয়োগ করেছিলেন ksh
- সম্ভবত এটি সম্পর্কিত? - তবে আমি এটি সম্পর্কে কিছুই জানি না। কিভাবে এটি শেল এটি এত ভাল করে?
আমার কাছে আরও আশ্চর্যের বিষয় হ'ল ksh
সত্যই যেখানে আপনি এটি জিজ্ঞাসা করেছেন সেখানে অফসেটটি ছেড়ে যায়। পেতে (প্রায়) একই আউট (গনুহ) sed
আপনি ব্যবহার করতে হবে -u
- খুব ধীর ।
এখানে একটি grep
v ksh
পরীক্ষা রয়েছে:
1000000 #grep + head
( grep -qm1 '^[^0-8]99999.*bar'; head -n1; ) \
0.02s user 0.00s system 90% cpu 0.026 total
999999foo bar #ksh + head
( ksh -c ':<#@(~(E)^[^0-8]99999.*bar)'; head -n1; ) \
0.02s user 0.00s system 73% cpu 0.023 total
ksh
grep
এখানে মারধর করে - তবে সবসময় তা হয় না - এগুলি অনেকটা বাঁধা। তবুও, এটি বেশ দুর্দান্ত, এবং ksh
বর্ণমালা সরবরাহ করে - এর ম্যাচের আগেhead
এর ইনপুট শুরু হয় ।
আমার ধারণা, এটি সত্য হওয়া খুব ভাল লাগে। এই কমান্ডগুলি হুডের নীচে আলাদাভাবে কী করছে?
ওহ, এবং দৃশ্যত এখানে একটি সাবশেলও নেই:
ksh -c 'printf %.5s "${<file;}"'
pattern
একটি রেগুলার এক্সপ্রেশন বা সহজ শেল প্যাটার্ন?