আপনি কিনা তার উপর নির্ভর করে বিভিন্ন পন্থা গ্রহণ করতে পারেন 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
।