ตัวลบบรรทัดซ้ำ
ลบบรรทัดที่ซ้ำกันออกจากข้อความ เก็บไว้เฉพาะบรรทัดที่ไม่ซ้ำกัน
บรรทัดอินพุต
บรรทัดที่ไม่ซ้ำ
การลบบรรทัดซ้ำคืออะไร?
การลบบรรทัดซ้ำคือกระบวนการสแกนกลุ่มข้อความทีละบรรทัดและเก็บไว้เฉพาะการปรากฏครั้งแรกของแต่ละบรรทัดที่ไม่ซ้ำกัน เมื่อลบบรรทัดซ้ำในเบราว์เซอร์ เครื่องมือจะแบ่งอินพุตที่อักขระขึ้นบรรทัดใหม่ ติดตามว่าบรรทัดใดปรากฏแล้วโดยใช้โครงสร้างข้อมูลแบบ hash (เช่น Set) และแสดงผลเฉพาะบรรทัดที่ยังไม่เคยพบมาก่อน ลำดับบรรทัดเดิมจะถูกรักษาไว้
สองบรรทัดถือว่าซ้ำกันเมื่อตรงกันทุกตัวอักษร อย่างไรก็ตาม ข้อมูลในชีวิตจริงมักไม่ยอมตรงกันแบบเป๊ะ ช่องว่างนำหน้าหรือตามหลัง การพิมพ์ตัวพิมพ์ใหญ่เล็กไม่สม่ำเสมอ และอักขระที่มองไม่เห็นอย่าง tab หรือ carriage return อาจทำให้บรรทัดที่ดูเหมือนกันถูกมองว่าแตกต่างกัน นั่นคือเหตุผลที่เครื่องมือลบข้อมูลซ้ำส่วนใหญ่มีตัวเลือกสำหรับการเปรียบเทียบแบบไม่คำนึงตัวพิมพ์และการตัดช่องว่างก่อนเปรียบเทียบ
การลบข้อมูลซ้ำเป็นการดำเนินการที่แตกต่างจากการเรียง คำสั่ง Unix sort -u จะเรียงและลบข้อมูลซ้ำพร้อมกัน ซึ่งเปลี่ยนลำดับบรรทัด หากต้องการรักษาลำดับเดิมของบรรทัด คุณต้องใช้วิธี seen-set ได้แก่ วนซ้ำผ่านบรรทัดตามลำดับ เพิ่มรูปแบบที่ปรับแล้วของแต่ละบรรทัดลงใน set และข้ามบรรทัดที่มีคีย์นั้นอยู่แล้ว เครื่องมือนี้ใช้วิธี seen-set ดังนั้นการปรากฏครั้งแรกจึงอยู่ในตำแหน่งเดิม
ทำไมต้องใช้ตัวลบบรรทัดซ้ำนี้?
วางข้อความของคุณ เลือกตัวเลือกการเปรียบเทียบ แล้วดูผลลัพธ์ที่ลบข้อมูลซ้ำแล้วทันที ไม่ต้องตั้งค่า command line ไม่ต้องเขียน 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 |
การตั้งค่าการคำนึงตัวพิมพ์และการจัดการช่องว่าง
มีสองตัวเลือกที่ควบคุมว่าเครื่องมือนี้ตัดสินใจว่าสองบรรทัดซ้ำกันหรือไม่ การเข้าใจว่าควรใช้ตัวเลือกไหนเมื่อใดช่วยป้องกันทั้ง false positive (มองบรรทัดต่างกันว่าซ้ำกัน) และ false negative (มองข้ามบรรทัดที่ควรตรงกัน)
ตัวอย่างโค้ด
ลบบรรทัดซ้ำด้วยโค้ดใน JavaScript, Python, Go และ command line แต่ละตัวอย่างแสดงการลบข้อมูลซ้ำโดยรักษาลำดับและจัดการการคำนึงตัวพิมพ์
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