এখানে একটি মজা। sed
প্রথম লাইনের সমস্ত অনুলিপি বের করে ফেলার জন্য আপনি সরাসরি ব্যবহার করতে পারেন এবং সমস্ত কিছু জায়গায় রেখে (প্রথম লাইনটি নিজেই সহ)।
sed '1{h;n;};G;/^\(.*\)\n\1$/d;s/\n.*$//' input
1{h;n;}
হোল্ড স্পেসে প্রথম লাইন রাখে, এটি মুদ্রণ করে এবং পরের লাইনে পড়ে — sed
প্রথম লাইনের জন্য বাকি কমান্ডগুলি এড়িয়ে চলে। (এটি দ্বিতীয় লাইনের জন্য প্রথম 1
পরীক্ষাটিও এড়িয়ে যায় , তবে সেই পরীক্ষার ফলে দ্বিতীয় লাইনে প্রয়োগ হত না matter
G
প্যাটার্ন স্পেসে হোল্ড স্পেসের সামগ্রীগুলি অনুসরণ করে একটি নতুন লাইন যুক্ত করে।
/^\(.*\)\n\1$/d
প্যাটার্ন স্পেসের সামগ্রীগুলি মুছে ফেলে (এভাবে পরবর্তী লাইনে এড়িয়ে যাওয়া) যদি নিউলাইনের পরে অংশটি (যেমন হোল্ড স্পেস থেকে সংযোজন করা হয়েছিল) নতুন লাইনের আগে অংশটির সাথে মেলে। এখানেই শিরোনামের সদৃশ হওয়া লাইনগুলি মুছে ফেলা হবে।
s/\n.*$//
G
কমান্ড দ্বারা যোগ করা পাঠ্যের অংশটি মুছে দেয় , যাতে যা মুদ্রিত হয় তা কেবল ফাইল থেকে পাঠ্যের লাইন।
তবে, যেহেতু রেজেক্স ব্যয়বহুল, তাই সামান্য দ্রুত পদ্ধতির ক্ষেত্রে একই শর্তটি (অবহেলিত) ব্যবহার P
করা হবে এবং যদি নতুন লাইনের পরে অংশটি (যেমন হোল্ড স্পেস থেকে সংযোজন করা হয়েছিল) অংশটির সাথে সঠিকভাবে মেলে না তবে নতুন লাইনটি ছড়িয়ে দেওয়া উচিত নতুন লাইনের আগে এবং তারপরে নিঃশর্তভাবে প্যাটার্ন স্পেসটি মুছুন:
sed '1{h;n;};G;/^\(.*\)\n\1$/!P;d' input
আপনার ইনপুট দেওয়া হলে আউটপুট হয়:
ID Data1 Data2
1 100 100
2 100 200
3 200 100
4 100 100
5 200 200
{ IFS= read -r head; printf '%s\n' "$head"; grep -vF "$head" ; } <file