ডুপ্লিকেট লাইন রিমুভ করুন
তালিকা পরিষ্কার করুন: পুনরাবৃত্তি সরান, ঠিকভাবে সাজান, ফাঁকা লাইন বাদ দিন। নিঃশব্দে তালিকা ছোট না করে এটি জানায় কোন লাইনগুলো ডুপ্লিকেট ছিল আর কতবার।
- কখনো সংরক্ষণ করা হয় না
- কোনো লাইন নেই, অপেক্ষা নেই
- সাইনআপ নেই, ওয়াটারমার্ক নেই
ফলাফল এখানে দেখা যাবে।
যেভাবে কাজ করে
তালিকা পেস্ট করুন
ইমেইল, URL, প্রোডাক্ট কোড — প্রতি লাইনে একটি করে যেকোনো কিছু। অথবা একটি টেক্সট ফাইল ছাড়ুন।
“একই” বলতে কী বোঝাবে, ঠিক করুন
শেষের স্পেস উপেক্ষা, বড়-ছোট হাতের অক্ষর উপেক্ষা, প্রথম বা শেষ কপি রাখা — অথবা যে লাইনের কোনো ডুপ্লিকেট ছিল, তার সবগুলোই সরানো।
সাজান ও গুছিয়ে নিন
স্বাভাবিক ক্রমে সাজান, উল্টে দিন, এলোমেলো করুন, লাইনে নম্বর দিন বা ফাঁকা লাইন বাদ দিন — তারপর ফলাফল কপি করুন।
যে লাইনগুলো রাখেন, সেগুলোর কী হয়
এই পেজে দুই ধরনের স্পেস সামলানোর ব্যবস্থা আছে, আর এ দুটি গুলিয়ে না ফেলাই ভালো। তুলনার জন্য ছাঁটা শুধু কি তৈরি করে, কখনো আপনার লাইন এডিট করে না — যে কপিটি টিকে থাকে, তার মূল স্পেস হুবহু থাকে। গোছানোর অপশনগুলো করে ঠিক উল্টো: ইনডেন্টেশন সরানো, পরপর থাকা স্পেস ও ট্যাব একটিতে নামিয়ে আনা, আর লাইনের প্রান্ত ছাঁটা — এগুলো সত্যিকারের এডিট, আর ডুপ্লিকেট সরানোর আগেই ঘটে, তাই এর কোনোটি চালু করলে লাইন দেখতে কেমন হবে তার পাশাপাশি কোনটি ডুপ্লিকেট ধরা হবে, সেটিও চুপচাপ বদলে যায়।
ফাঁকা লাইনকে অন্য যেকোনো লাইনের মতোই তুলনা করা হয়, অর্থাৎ প্রথমটির পরের প্রতিটি ফাঁকা লাইন অন্য ডুপ্লিকেটের সঙ্গেই হারিয়ে যায় — অনুচ্ছেদের মতো ফাঁক রাখা তালিকা ফিরে আসে একটিমাত্র ফাঁকা লাইন নিয়ে, প্রথমটি যেখানে ছিল সেখানে। আর কী পুনরাবৃত্ত হলো তার রিপোর্ট আপনার লাইন নয়, কি দেখায়: ছাঁটা, আর বড়-ছোট হাতের অক্ষর উপেক্ষা করতে বললে ছোট হাতের। তাই আপনার তালিকায় Smith ও SMITH দুই রূপে থাকা একটি এন্ট্রি একবারই রিপোর্ট হয়, ছোট হাতের অক্ষরে, সংখ্যা দুই। সেই তালিকায় সবচেয়ে বেশিবার আসা পঞ্চাশটি পর্যন্ত দেখানো হয়।
যা-ই দিন না কেন, যা বের হয় তা শুধু লাইন ফিড দিয়ে জোড়া থাকে, তাই Windows ফাইল থেকে পেস্ট করা তালিকা পথে তার ক্যারেজ রিটার্ন হারায় — সাধারণত আপনি এটিই চান, তবে ফলাফল এমন কোথাও আবার পেস্ট করলে, যেখানে এর গুরুত্ব আছে, জেনে রাখা ভালো। আরেকটি পার্শ্বপ্রতিক্রিয়া: “বড়-ছোট হাতের অক্ষর উপেক্ষা করুন” চালু করলে তুলনার পাশাপাশি সাজানোও বদলায়, আর তখন সাজানোর সময় অ্যাকসেন্টযুক্ত ও সাধারণ অক্ষরের পার্থক্যও আর করা হয় না, তাই resume আর résumé আলাদা না হয়ে একসাথে আসে।
অন্য কিছু দরকার হলে
তালিকাটি যখন আসলে একটি টেবিল, তখন লাইন তুলনা ভুল গড়নের টুল। যে CSV-তে “ডুপ্লিকেট” মানে এক কলামে মিলে যাওয়া দুটি সারি, তা স্ট্রিংয়ের প্রশ্ন নয়, আর সেভাবে দেখলে হয় ডুপ্লিকেট ধরা পড়ে না, নয়তো শুধু দেখতে একই রকম সারিগুলো মুছে যায়। আগে থেকে খোলা ফাইলের জন্য স্প্রেডশিটের নিজস্ব Remove Duplicates কাজটি ঠিকভাবে করে, আর কমান্ড লাইনে mlr uniq -g সিদ্ধান্ত নেওয়া ফিল্ডটির নাম দিয়ে যেকোনো সাইজে একই কাজ করে।
ট্যাবে ধরে না এমন বড় তালিকা, বা যে তালিকা আগামী সপ্তাহে আবার পরিষ্কার করবেন, তার জন্য কমান্ড লাইনে একটিমাত্র স্ট্রিমিং এক্সপ্রেশনই যথেষ্ট: awk '!seen[$0]++' প্রথম কপি আর মূল ক্রম রাখে — এই পেজ ডিফল্টভাবে ঠিক যা করে — আপনার মেমোরির চেয়ে বড় ফাইলেও। এতে ছাঁটা নেই, বড়-ছোট হাতের অক্ষর মেলানো নেই, কী পুনরাবৃত্ত হলো তার রিপোর্টও নেই — এটিই বিনিময়, আর এক কোটি লাইনের ফাইলের জন্য এটিই সঠিক।
সাধারণ প্রশ্নোত্তর
আমার তালিকা কি কোথাও সংরক্ষণ করা হয়?
না। কিছুই সংরক্ষণ করা হয় না, কোনো রিকোয়েস্টও পাঠানো হয় না। পেজ লোড হওয়ার পর ইন্টারনেট সংযোগ বিচ্ছিন্ন করলেও এটি কাজ করে।
সরানোর পরও ডুপ্লিকেট থেকে যায় কেন?
প্রায় সবসময় লাইনের শেষের স্পেসের কারণে। শেষে আলাদা সংখ্যক স্পেস থাকা দুটি লাইন স্ক্রিনে হুবহু এক দেখায়, কিন্তু আসলে এক নয়, তাই হুবহু তুলনায় দুটোই থেকে যায় — আর আপনি ধরে নেন টুলটি নষ্ট। এ কারণেই এখানে তুলনার আগে ছেঁটে নেওয়ার অপশন ডিফল্টভাবে চালু থাকে। গুরুত্বপূর্ণ হলো, এটি শুধু তুলনাকে প্রভাবিত করে: যে লাইনটি টিকে থাকে তার মূল লেখা অক্ষত থাকে, কারণ চুপচাপ আপনার লাইন এডিট করা “ডুপ্লিকেট সরান”-র অর্থ নয়।
কোন কপিটি রাখা হয়?
ডিফল্টভাবে প্রথমটি, আর বাকিগুলোর ক্রম অপরিবর্তিত থাকে — তালিকা আগে থেকেই অর্থপূর্ণ ক্রমে থাকলে এটি গুরুত্বপূর্ণ। চাইলে শেষেরটি রাখতে পারেন, অথবা যে লাইনের কোনো ডুপ্লিকেট ছিল তার সবগুলোই সরিয়ে শুধু ঠিক একবার আসা লাইনগুলো রাখতে পারেন। শেষেরটি দিয়েই কোনো তালিকার অনন্য এন্ট্রিগুলো খুঁজে পাওয়া যায়।
সাজালে item10 কেন item2-এর আগে আসে?
এটি সাধারণ বর্ণানুক্রমিক সাজানো, যেখানে “1” আসে “2”-এর আগে, আর সংখ্যার বাকি অংশ পর্যন্ত তুলনা পৌঁছায়ই না। স্বাভাবিক ক্রমে সাজানো চালু করলে পরপর থাকা অঙ্কগুলোকে সংখ্যা হিসেবে তুলনা করা হয়, তাই item2 আসে item10-এর আগে — মানুষ যে ক্রম আশা করে। অ্যাকসেন্টযুক্ত লেখাও ঠিকভাবে সামলানো হয়: সাধারণ তুলনা “Zürich”-কে “Zyzzyva”-এর পরে সাজায়, কারণ তা অক্ষর নয়, ভেতরের সংখ্যাগুলো তুলনা করে।
কী সরানো হলো, তা কি জানায়?
হ্যাঁ — একাধিকবার আসা লাইনগুলো তাদের সংখ্যাসহ তালিকা আকারে দেখানো হয়, সবচেয়ে বেশিবার আসাটি প্রথমে। তিনটি লাইন সরে গেছে জানার চেয়ে কোন এন্ট্রিটি চারবার এসেছিল তা জানা সাধারণত বেশি কাজের।
এলোমেলো করা কি সত্যিই র্যান্ডম?
হ্যাঁ। এটি ব্রাউজারের ক্রিপ্টোগ্রাফিক র্যান্ডম উৎস দিয়ে Fisher-Yates শাফল ব্যবহার করে। প্রচলিত শর্টকাট — র্যান্ডম তুলনা দিয়ে সাজানো — আসলে শাফলই নয়: সাজানোর অ্যালগরিদম ধরে নেয় তুলনা সুসংগত, আর র্যান্ডম তুলনা দিলে ফলাফল পরিমাপযোগ্যভাবে মূল ক্রমের দিকে ঝুঁকে থাকে। তালিকা থেকে বিজয়ী বাছাই করলে এই পার্থক্য গুরুত্বপূর্ণ।
সাইজের কোনো সীমা আছে?
নির্দিষ্ট কোনো সাইজ সীমা নয়, সীমা হলো আপনার ডিভাইসের মেমোরি। কয়েক লাখ লাইনের তালিকাও ঠিকঠাক চলে।
জেনে রাখুন: সাজানোর সময় আপনার ব্রাউজারের ভাষার নিয়ম ব্যবহার হয়, তাই অ্যাকসেন্টযুক্ত অক্ষর আর ভিন্ন বর্ণমালা বাইটের মান অনুযায়ী নয়, পাঠক যেভাবে আশা করেন সেভাবে সাজে। এর মানে ব্রাউজারভেদে ক্রম সামান্য আলাদাও হতে পারে। খুব বড় তালিকা পুরোটাই মেমোরিতে রাখা হয়।
এই টুলটি আপনার ওয়েবসাইটে যোগ করুন
যেকোনো ব্লগ, ক্লাসের পেজ বা হেল্প আর্টিকেলের জন্য ফ্রি। একটি স্নিপেট পেস্ট করলেই আপনার ভিজিটররা আপনার পেজেই এটি ব্যবহার করতে পারবেন।
আরও টেক্সট টুলস
শব্দ গণনা (ওয়ার্ড কাউন্টার)
শব্দ, বাক্য আর পড়তে কত সময় লাগবে
কেস কনভার্টার
UPPER, lower, Title Case, camelCase ও বাকিগুলো
টেক্সট তুলনা
দুই সংস্করণের মধ্যে ঠিক কী বদলেছে, দেখুন
অক্ষর গণনা (ক্যারেক্টার কাউন্টার)
অক্ষর, বাইট, আর আপনার সীমা আসলে কী গোনে
HTML মিনিফায়ার
পেজ না ভেঙে HTML ছোট করুন
CSS মিনিফায়ার
স্টাইলশিট ছোট করুন, না হলে জানুন কেন হলো না