مزيل الأسطر المكررة
احذف الأسطر المكررة من النص مع الإبقاء على الأسطر الفريدة فقط
أسطر الإدخال
الأسطر الفريدة
ما هي إزالة الأسطر المكررة؟
إزالة الأسطر المكررة هي عملية مسح كتلة نصية سطراً بسطر والاحتفاظ بأول ظهور لكل سطر فريد فقط. عند إزالة الأسطر المكررة أونلاين، تُقسّم الأداة النص عند أحرف السطر الجديد، وتتتبع الأسطر التي ظهرت مسبقاً باستخدام بنية بيانات قائمة على التجزئة (مثل Set)، وتخرج فقط الأسطر التي لم تُرَ من قبل. يُحافَظ على الترتيب الأصلي للأسطر.
يُعدّ سطران متطابقَين عندما يتطابقان تماماً حرفاً بحرف. غير أن البيانات الواقعية نادراً ما تتوافق مع المطابقة التامة. فالمسافات البادئة أو الزائدة، وتفاوت حالة الأحرف، والأحرف غير المرئية كالجداولة أو رجوع الحرف، كلها قد تجعل أسطراً تبدو متطابقة تُعامَل على أنها فريدة. لذلك توفر معظم أدوات إزالة التكرار خيارات للمقارنة غير الحساسة لحالة الأحرف وحذف المسافات قبل المقارنة.
إزالة التكرار عملية مستقلة عن الفرز. أمر Unix الخاص sort -u يفرز الأسطر أبجدياً ثم يزيل التكرارات المتجاورة، مما يغيّر ترتيب الأسطر. إذا كنت بحاجة للحفاظ على الترتيب الأصلي، فأنت تحتاج إلى نهج المجموعة المُشاهَدة (seen-set): تمر عبر الأسطر بالتسلسل، تضيف الشكل المعياري لكل سطر إلى المجموعة، وتتخطى أي سطر تكون مفتاحه موجوداً بالفعل. تستخدم هذه الأداة نهج المجموعة المُشاهَدة، فتبقى التكرارات الأولى في مواضعها الأصلية.
لماذا تستخدم مزيل التكرار هذا؟
الصق نصك، اختر خيارات المقارنة، وشاهد النتيجة خالية من التكرارات فوراً. لا إعداد لسطر الأوامر، ولا كتابة للتعبيرات النمطية، ولا رفع للملفات.
حالات استخدام مزيل الأسطر المكررة
مقارنة طرق إزالة التكرار
توجد عدة طرق لإزالة الأسطر المكررة، لكل منها مزايا وعيوب مختلفة من حيث الحفاظ على الترتيب واستخدام الذاكرة والدقة.
| الطريقة | كيف تعمل | ترتيب المخرجات | أين تُستخدم |
|---|---|---|---|
| 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