বেশিরভাগ সমাধান সহ বেশিরভাগ সমাধান একটি স্থান ছেড়ে যায়। এখানে বিকল্পগুলি এই সমস্যাটি এড়ায়।
বিকল্প 1
একটি সাধারণ কাটা সমাধান (শুধুমাত্র একক ডিলিমিটারগুলির সাথে কাজ করে):
command | cut -d' ' -f3-
বিকল্প 2
কখনও কখনও পুনরায় ক্যালক জোর করে প্রথম ক্ষেত্রগুলি বাদ দিয়ে অ্যাডেড লিডিং স্পেস (ওএফএস) সরিয়ে ফেলুন (কিছু সংস্করণের সাথে কাজ করে):
command | awk '{ $1=$2="";$0=$0;} NF=NF'
বিকল্প 3
প্রতিটি ক্ষেত্রের সাথে ফর্ম্যাট করা মুদ্রণ printf
আরও নিয়ন্ত্রণ দেবে:
$ in=' 1 2 3 4 5 6 7 8 '
$ echo "$in"|awk -v n=2 '{ for(i=n+1;i<=NF;i++) printf("%s%s",$i,i==NF?RS:OFS);}'
3 4 5 6 7 8
যাইহোক, পূর্ববর্তী সমস্ত উত্তরগুলি ক্ষেত্রগুলির মধ্যে সমস্ত পুনরাবৃত্তি FS কে OFS এ পরিবর্তন করে। আসুন এমন একটি দম্পতি তৈরি করুন যা এটি না করে।
বিকল্প 4 (প্রস্তাবিত)
সামনের ক্ষেত্রগুলি এবং ডিলিমিটারগুলি সরাতে সাব সহ একটি লুপ।
এবং জায়গার পরিবর্তে এফএসের মান ব্যবহার করে (যা পরিবর্তিত হতে পারে)।
আরও পোর্টেবল, এবং এফএস-এর পরিবর্তনগুলিকে অফস-এ পরিবর্তিত করে না:
দ্রষ্টব্য:^[FS]*
শীর্ষস্থানীয় স্পেসগুলির সাথে একটি ইনপুট গ্রহণ করা The
$ in=' 1 2 3 4 5 6 7 8 '
$ echo "$in" | awk '{ n=2; a="^["FS"]*[^"FS"]+["FS"]+";
for(i=1;i<=n;i++) sub( a , "" , $0 ) } 1 '
3 4 5 6 7 8
বিকল্প 5
এমন একটি সমাধান তৈরি করা সম্ভব যা অতিরিক্ত (শীর্ষস্থানীয় বা পিছনে) সাদা স্থান যোগ করে না এবং gensub
জিএনইউ অ্যাডক থেকে ফাংশনটি ব্যবহার করে বিদ্যমান হোয়াইটস্পেস সংরক্ষণ করে :
$ echo ' 1 2 3 4 5 6 7 8 ' |
awk -v n=2 'BEGIN{ a="^["FS"]*"; b="([^"FS"]+["FS"]+)"; c="{"n"}"; }
{ print(gensub(a""b""c,"",1)); }'
3 4 5 6 7 8
এটি একটি গণনা প্রদত্ত ক্ষেত্রগুলির একটি গ্রুপকে অদলবদল করতেও ব্যবহৃত হতে পারে n
:
$ echo ' 1 2 3 4 5 6 7 8 ' |
awk -v n=2 'BEGIN{ a="^["FS"]*"; b="([^"FS"]+["FS"]+)"; c="{"n"}"; }
{
d=gensub(a""b""c,"",1);
e=gensub("^(.*)"d,"\\1",1,$0);
print("|"d"|","!"e"!");
}'
|3 4 5 6 7 8 | ! 1 2 !
অবশ্যই, এই ক্ষেত্রে, অফসটি লাইনের উভয় অংশ পৃথক করতে ব্যবহৃত হয়, এবং ক্ষেত্রগুলির পিছনে সাদা স্থানটি এখনও মুদ্রিত হয়।
দ্রষ্টব্য: [FS]*
ইনপুট লাইনে শীর্ষস্থানীয় স্থানগুলিতে অনুমতি দেওয়ার জন্য ব্যবহৃত হয়।
grep | awk
এটি একটি প্রতিরোধ ব্যবস্থা - আপনি চানawk '/!/ { print $2 }'