সদৃশ লাইন অপসারণকারী
পাঠ্য থেকে সদৃশ লাইনগুলি সরান, শুধুমাত্র অনন্য লাইনগুলি রাখুন
ইনপুট লাইন
অনন্য লাইন
সদৃশ লাইন অপসারণ কী?
সদৃশ লাইন অপসারণ হলো একটি টেক্সট ব্লককে লাইন ধরে স্ক্যান করে প্রতিটি অনন্য লাইনের শুধুমাত্র প্রথম উপস্থিতি রাখার প্রক্রিয়া। অনলাইনে সদৃশ লাইন সরানোর সময়, টুলটি আপনার ইনপুটকে নিউলাইন ক্যারেক্টার দিয়ে ভাগ করে, হ্যাশ-ভিত্তিক ডেটা স্ট্রাকচার (যেমন Set) ব্যবহার করে কোন লাইনগুলি আগে এসেছে তা ট্র্যাক করে, এবং শুধুমাত্র যে লাইনগুলি আগে দেখা যায়নি সেগুলি আউটপুট করে। মূল লাইনের ক্রম বজায় থাকে।
দুটি লাইন তখনই সদৃশ বলে বিবেচিত হয় যখন সেগুলি প্রতিটি অক্ষরে হুবহু মিলে যায়। তবে, বাস্তব দুনিয়ার ডেটা কখনো সরাসরি মিলের উপযোগী হয় না। শুরু বা শেষের হোয়াইটস্পেস, অসামঞ্জস্যপূর্ণ ক্যাপিটালাইজেশন, এবং ট্যাব বা ক্যারেজ রিটার্নের মতো অদৃশ্য ক্যারেক্টার — এই সব কারণেই একই দেখতে লাইনগুলি আলাদা হিসেবে বিবেচিত হতে পারে। এই কারণেই বেশিরভাগ ডিডুপ্লিকেশন টুল তুলনার আগে কেস-ইনসেনসিটিভ তুলনা ও হোয়াইটস্পেস ট্রিমিংয়ের বিকল্প দেয়।
ডিডুপ্লিকেশন সাজানো থেকে আলাদা একটি অপারেশন। Unix কমান্ড sort -u একই সাথে সাজায় এবং ডিডুপ্লিকেট করে, যা লাইনের ক্রম পরিবর্তন করে। আপনি যদি লাইনের মূল ক্রম বজায় রাখতে চান, তাহলে seen-set পদ্ধতি দরকার: লাইনগুলি ক্রমানুসারে অতিক্রম করুন, প্রতিটি লাইনের নর্মালাইজড রূপ একটি সেটে যোগ করুন, এবং যে লাইনের কী ইতোমধ্যে বিদ্যমান তা বাদ দিন। এই টুল seen-set পদ্ধতি ব্যবহার করে, তাই আপনার প্রথম উপস্থিতিগুলি তাদের মূল অবস্থানে থাকে।
কেন এই সদৃশ অপসারণকারী ব্যবহার করবেন?
আপনার টেক্সট পেস্ট করুন, তুলনার বিকল্প বেছে নিন, এবং তাৎক্ষণিকভাবে ডিডুপ্লিকেটেড ফলাফল দেখুন। কোনো কমান্ড-লাইন সেটআপ নেই, কোনো regex লেখার দরকার নেই, কোনো ফাইল আপলোড নেই।
সদৃশ লাইন অপসারণকারীর ব্যবহারের ক্ষেত্র
ডিডুপ্লিকেশন পদ্ধতির তুলনা
সদৃশ লাইন সরানোর বেশ কয়েকটি পদ্ধতি রয়েছে, প্রতিটির ক্রম সংরক্ষণ, মেমোরি ব্যবহার ও নির্ভুলতার ক্ষেত্রে ভিন্ন সুবিধা-অসুবিধা রয়েছে।
| পদ্ধতি | কীভাবে কাজ করে | আউটপুটের ক্রম | কোথায় ব্যবহৃত হয় |
|---|---|---|---|
| Set | Hash-based, O(1) lookup | Unordered | JavaScript Set, Python set() |
| Sorted + scan | Sort then skip adjacent | Sorted output | Unix sort -u, C++ std::unique |
| Seen-set + list | Track seen, preserve order | Original order | This tool, Python dict.fromkeys() |
| Bloom filter | Probabilistic membership | May miss some | Large-scale pipelines, Redis |
| SQL DISTINCT | Database-level dedup | Query-dependent | SELECT DISTINCT col FROM table |
কেস সংবেদনশীলতা ও হোয়াইটস্পেস পরিচালনা
দুটি বিকল্প নির্ধারণ করে এই টুল কীভাবে সিদ্ধান্ত নেয় যে দুটি লাইন সদৃশ কিনা। প্রতিটি বিকল্প কখন ব্যবহার করতে হবে তা বোঝা মিথ্যা ধনাত্মক (ভিন্ন লাইনকে সদৃশ বলা) এবং মিথ্যা ঋণাত্মক (মিলে যাওয়া লাইন মিস করা) উভয়ই প্রতিরোধ করে।
কোড উদাহরণ
JavaScript, Python, Go, এবং কমান্ড লাইনে প্রোগ্রামগতভাবে সদৃশ লাইন সরানোর পদ্ধতি। প্রতিটি উদাহরণ ক্রম-সংরক্ষণকারী ডিডুপ্লিকেশন দেখায় এবং কেস সংবেদনশীলতা পরিচালনা করে।
const text = `apple
banana
apple
Cherry
banana
cherry`
// Remove exact duplicates, preserve order
const unique = [...new Map(
text.split('\n').map(line => [line, line])
).values()].join('\n')
// → "apple\nbanana\nCherry\ncherry"
// Case-insensitive deduplication
const seen = new Set()
const ciUnique = text.split('\n').filter(line => {
const key = line.toLowerCase()
if (seen.has(key)) return false
seen.add(key)
return true
}).join('\n')
// → "apple\nbanana\nCherry"
// Trim whitespace before comparing
const trimDedup = text.split('\n').filter(line => {
const key = line.trim().toLowerCase()
if (seen.has(key)) return false
seen.add(key)
return true
}).join('\n')text = """apple
banana
apple
Cherry
banana
cherry"""
lines = text.splitlines()
# Remove duplicates, preserve order (Python 3.7+)
unique = list(dict.fromkeys(lines))
# → ['apple', 'banana', 'Cherry', 'cherry']
# Case-insensitive deduplication
seen = set()
ci_unique = []
for line in lines:
key = line.lower()
if key not in seen:
seen.add(key)
ci_unique.append(line)
# → ['apple', 'banana', 'Cherry']
# With whitespace trimming
seen = set()
trimmed = []
for line in lines:
key = line.strip().lower()
if key not in seen:
seen.add(key)
trimmed.append(line)package main
import (
"fmt"
"strings"
)
func removeDuplicates(text string) string {
lines := strings.Split(text, "\n")
seen := make(map[string]bool)
result := make([]string, 0, len(lines))
for _, line := range lines {
if !seen[line] {
seen[line] = true
result = append(result, line)
}
}
return strings.Join(result, "\n")
}
func main() {
text := "apple\nbanana\napple\ncherry\nbanana"
fmt.Println(removeDuplicates(text))
// → apple\nbanana\ncherry
}# Remove duplicates (sorts output — does not preserve order)
sort -u file.txt
# Remove duplicates while preserving original order
awk '!seen[$0]++' file.txt
# Case-insensitive dedup, preserve order
awk 'BEGIN{IGNORECASE=1} !seen[tolower($0)]++' file.txt
# Trim whitespace then dedup
sed 's/^[[:space:]]*//;s/[[:space:]]*$//' file.txt | awk '!seen[$0]++'
# Count duplicates before removing
sort file.txt | uniq -c | sort -rn