আপনি কিনা তার উপর নির্ভর করে বিভিন্ন পন্থা গ্রহণ করতে পারেন awkএকইরূপে RS(সনাতন মত একটি একক অক্ষর হিসেবে awkনা বাস্তবায়নের) অথবা একটি রেগুলার এক্সপ্রেশন হিসাবে (মত gawkবা mawkনা)। খালি ফাইলগুলি awkএড়িয়ে যাওয়ার প্রবণতা হিসাবে বিবেচিত হওয়াও কঠিন ।
gawk, mawkবা অন্যান্য awkবাস্তবায়ন যেখানে RSএকটি রেজিপেক্স হতে পারে।
এই বাস্তবায়নগুলিতে (কারণ mawk, সাবধান! কিছু থিমসডিকির দ্বারা পরিচালিত আধুনিক সংস্করণের পরিবর্তে দেবিয়ান জাতীয় কিছু ওএসের পাঠানো পুরানো সংস্করণে ) যদি RSএকটি একক অক্ষর থাকে তবে রেকর্ড বিভাজকটি সেই চরিত্রটি থাকে বা খালি awkহলে অনুচ্ছেদে মোডে প্রবেশ করে RS, বা RSঅন্যথায় একটি নিয়মিত অভিব্যক্তি হিসাবে আচরণ করে ।
এর সমাধানটি হ'ল একটি নিয়মিত ভাব প্রকাশ করা যা সম্ভবত মেলে না। কিছু মনে x^বা $x( xশুরু করার আগে, বা শেষের পরে) মনে আসে। তবে কিছু (বিশেষত সাথে gawk) অন্যের চেয়ে ব্যয়বহুল। এখনও অবধি, আমি খুঁজে পেয়েছি যে ^$এটি সবচেয়ে দক্ষ একটি। এটি কেবল একটি খালি ইনপুটটিতে মিলতে পারে তবে এর বিরুদ্ধে মিলার মতো কিছুই থাকবে না।
সুতরাং আমরা করতে পারি:
awk -v RS='^$' '{printf "%s: <%s>\n", FILENAME, $0}' file1 file2...
যদিও একটি সতর্কতাই হ'ল এটি খালি ফাইলগুলি এড়িয়ে যায় (বিপরীতে perl -0777 -n)। পরিবর্তে awkএকটি ENDFILEবিবৃতিতে কোডটি রেখে জিএনইউ দিয়ে সম্বোধন করা যেতে পারে । তবে আমাদের $0একটি বিগইনফাইলে বিবৃতিতে পুনরায় সেট করতে হবে কারণ এটি খালি ফাইল প্রক্রিয়া করার পরে পুনরায় সেট করা হবে না:
gawk -v RS='^$' '
BEGINFILE{$0 = ""}
ENDFILE{printf "%s: <%s>\n", FILENAME, $0}' file1 file2...
traditional awkতিহ্যবাহী বাস্তবায়ন, পসিক্সawk
এর মধ্যে RSকেবল একটি চরিত্র, তাদের BEGINFILE/ নেই ENDFILE, তাদের RTচলক নেই, তারা সাধারণত NUL চরিত্রটি প্রক্রিয়া করতে পারে না।
আপনি ভেবেছিলেন যে RS='\0'ব্যবহারটি তখন কার্যকর হতে পারে যেহেতু তারা ইনপুট প্রক্রিয়া করতে পারে না যার মধ্যে NUL বাইট রয়েছে, তবে না, RS='\0'traditional তিহ্যবাহী বাস্তবায়নের ক্ষেত্রে যেমন RS=অনুচ্ছেদ মোড is
একটি সমাধান হতে পারে এমন একটি অক্ষর ব্যবহার করা যা ইনপুটটির মতো সন্ধানের সম্ভাবনা নেই \1। মাল্টিবাইট চরিত্রের লোকেলগুলিতে, আপনি এটিকে বাইট-সিকোয়েন্সগুলি তৈরি করতে পারেন $'\U10FFFE'যা ইউটিএফ -8 লোকেলের মতো বরাদ্দ না দেওয়া বা অ-অক্ষরগুলি তৈরি করে এমন অক্ষর গঠন করে যা ঘটে যাওয়ার খুব সম্ভবত সম্ভাবনা নেই । যদিও সত্যই নির্বোধ নয় এবং খালি ফাইলগুলি নিয়ে আপনারও সমস্যা রয়েছে।
আর একটি সমাধান হ'ল সম্পূর্ণ ইনপুটটি একটি ভেরিয়েবলের মধ্যে সঞ্চয় করা এবং শেষে স্ট্যান্ড স্টেটমেন্টে প্রক্রিয়া করা। এর অর্থ আপনি একবারে কেবল একটি ফাইল প্রক্রিয়া করতে পারেন যদিও:
awk '{content = content $0 RS}
END{$0 = content
printf "%s: <%s>\n", FILENAME, $0
}' file
এটি এর সমতুল্য sed:
sed '
:1
$!{
N;b1
}
...' file1
এই পদ্ধতির সাথে আরেকটি সমস্যা হ'ল যদি ফাইলটি একটি নতুন লাইনের চরিত্রের মধ্যে না শেষ হয় (এবং খালি ছিল না) তবে একটি এখনও নির্বিচারে $0শেষে যুক্ত করা হয়েছে (সহ gawk, আপনি এর RTপরিবর্তে এটি ব্যবহার করে কাজ RSকরবেন উপরের কোড)। একটি সুবিধা হ'ল আপনার NR/ / তে ফাইলটিতে রেখার সংখ্যার রেকর্ড রয়েছে FNR।