중복 줄 제거기

텍스트에서 중복 줄을 제거하고 고유한 줄만 유지

예시 시도

입력 줄

고유 줄

로컬에서 실행 · 시크릿 붙여넣기 안전
고유 줄이 여기에 표시됩니다…

중복 줄 제거란?

중복 줄 제거란 텍스트 블록을 줄 단위로 스캔하여 각 고유 줄의 첫 번째 등장만 유지하는 과정입니다. 온라인에서 중복 줄을 제거할 때, 도구는 입력을 줄바꿈 문자 기준으로 분리하고, Set과 같은 해시 기반 자료구조를 사용하여 이미 등장한 줄을 추적하며, 아직 나타나지 않은 줄만 출력합니다. 원래 줄 순서는 그대로 유지됩니다.

두 줄이 문자 하나하나까지 정확히 일치할 때 중복으로 처리됩니다. 그러나 실제 데이터는 정확한 일치를 보장하지 않는 경우가 많습니다. 앞뒤 공백, 일관성 없는 대소문자, 탭이나 캐리지 리턴 같은 보이지 않는 문자로 인해 겉보기엔 동일한 줄이 서로 다른 줄로 처리될 수 있습니다. 그래서 대부분의 중복 제거 도구는 비교 전 대소문자 구분 없는 비교와 공백 제거 옵션을 제공합니다.

중복 제거는 정렬과는 별개의 작업입니다. Unix 명령어 sort -u는 정렬과 중복 제거를 동시에 수행하므로 줄 순서가 바뀝니다. 원래 순서를 유지해야 한다면 seen-set 방식을 사용해야 합니다. 줄을 순서대로 순회하면서 각 줄의 정규화된 형태를 집합에 추가하고, 이미 키가 존재하는 줄은 건너뜁니다. 이 도구는 seen-set 방식을 사용하므로 첫 번째 등장하는 줄이 원래 위치를 유지합니다.

이 중복 제거기를 사용하는 이유

텍스트를 붙여넣고, 비교 옵션을 선택하면 중복 제거된 결과를 즉시 확인할 수 있습니다. 명령줄 설정, 정규식 작성, 파일 업로드가 필요 없습니다.

즉시 중복 제거
입력하거나 붙여넣는 즉시 결과가 업데이트됩니다. 대소문자 구분과 공백 제거 옵션을 토글하여 다시 실행하지 않아도 출력에 미치는 영향을 확인할 수 있습니다.
🔒
개인정보 보호 우선 처리
모든 중복 제거는 JavaScript를 사용하여 브라우저에서 실행됩니다. 텍스트는 기기에 머물며 서버에 업로드되거나 어디에도 기록되지 않습니다.
🎯
유연한 비교 설정
대소문자 구분 없는 모드를 활성화하면 "Apple"과 "apple"을 같은 줄로 처리합니다. 공백 제거를 켜면 비교 전 앞뒤 공백과 탭을 무시합니다.
📋
계정 불필요
페이지를 열고 바로 중복을 제거하세요. 회원가입, 브라우저 확장 프로그램, 데스크톱 설치가 필요 없습니다. 최신 브라우저가 있는 모든 기기에서 작동합니다.

중복 줄 제거기 활용 사례

프론트엔드 개발
CSS 클래스 목록 정리, 중복 import 문 제거, i18n 번역 키 중복 제거. 커밋 전에 중복을 제거하면 번들 비대화를 방지하고 병합 충돌을 줄일 수 있습니다.
백엔드 엔지니어링
브랜치 병합 후 requirements.txt, Gemfile, package.json 의존성 목록의 중복 항목을 제거합니다. 허용 목록, 차단 목록, 라우팅 테이블에서 중복 항목을 제거합니다.
DevOps 및 인프라
.env 파일, 호스트 목록, Kubernetes ConfigMap의 중복 항목을 정리합니다. 중복 환경 변수는 자동으로 덮어써지므로, 배포 전에 이를 발견하면 추적하기 어려운 설정 버그를 방지할 수 있습니다.
QA 및 테스트 자동화
테스트 실행 매니페스트에서 중복 테스트 케이스 ID를 제거하거나 자동 생성된 테스트 스위트에서 중복 단언문을 제거합니다. 로그 출력에서 오류 메시지를 중복 제거하여 고유한 오류 집합을 확인합니다.
데이터 엔지니어링
CSV 내보내기나 텍스트로 붙여넣은 SQL 쿼리 결과에서 중복 행을 제거합니다. 이메일 목록, 사용자 ID 목록, 태그 목록을 데이터베이스나 파이프라인에 가져오기 전에 정리합니다.
학생 및 학습자
단어장, 참고문헌 목록, 학습 노트에서 중복 항목을 제거합니다. 여러 출처의 내용을 붙여넣어 스프레드시트 프로그램 없이도 깨끗하고 중복 없는 목록을 얻을 수 있습니다.

중복 제거 방법 비교

중복 줄을 제거하는 방법에는 여러 가지가 있으며, 각각 순서 유지, 메모리 사용량, 정확도 면에서 서로 다른 트레이드오프를 가집니다.

방법작동 방식출력 순서사용 예
SetHash-based, O(1) lookupUnorderedJavaScript Set, Python set()
Sorted + scanSort then skip adjacentSorted outputUnix sort -u, C++ std::unique
Seen-set + listTrack seen, preserve orderOriginal orderThis tool, Python dict.fromkeys()
Bloom filterProbabilistic membershipMay miss someLarge-scale pipelines, Redis
SQL DISTINCTDatabase-level dedupQuery-dependentSELECT DISTINCT col FROM table

대소문자 구분 및 공백 처리

두 가지 옵션이 이 도구가 두 줄을 중복으로 판단하는 방식을 제어합니다. 각 옵션의 사용 시점을 이해하면 오탐(다른 줄을 중복으로 처리)과 미탐(일치해야 할 줄을 놓침)을 모두 방지할 수 있습니다.

대소문자 구분 (기본값: 켬)
활성화하면 "Apple"과 "apple"을 서로 다른 줄로 처리합니다. 대소문자가 일관성 없지만 의미는 동일한 사용자 입력 데이터, 도메인 이름 목록 등을 중복 제거할 때는 이 옵션을 끄세요.
공백 제거 (기본값: 켬)
활성화하면 비교 전 앞뒤 공백과 탭을 제거합니다. 겉보기엔 동일하지만 보이지 않는 문자가 다른 줄을 감지합니다. 복사한 터미널 출력, 들여쓰기된 설정 파일, 에디터 아티팩트에서 흔히 발생합니다.

코드 예제

JavaScript, Python, Go, 명령줄에서 프로그래밍 방식으로 중복 줄을 제거합니다. 각 예제는 순서를 유지하는 중복 제거를 보여주며 대소문자 구분을 처리합니다.

JavaScript
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')
Python
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)
Go
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
}
CLI (bash)
# 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

자주 묻는 질문

중복 제거와 sort -u의 차이점은 무엇인가요?
sort -u 명령어는 먼저 모든 줄을 알파벳 순으로 정렬한 후 인접한 중복을 제거합니다. 이로 인해 원래 줄 순서가 변경됩니다. 이 도구가 사용하는 seen-set 방식은 순서대로 줄을 순회하며 이미 등장한 줄을 건너뛰어 원래 순서를 유지합니다. 정렬과 고유 출력이 모두 필요하면 sort -u를 사용하고, 순서가 중요하면 seen-set 방식을 사용하세요.
중복을 제거할 때 텍스트가 서버로 전송되나요?
아니요. 모든 처리는 JavaScript를 사용하여 브라우저에서 이루어집니다. 텍스트는 기기를 벗어나지 않습니다. 브라우저 DevTools 네트워크 탭을 열어 텍스트를 붙여넣고 옵션을 전환할 때 아무 요청도 발생하지 않음을 직접 확인할 수 있습니다.
이 도구는 몇 줄까지 처리할 수 있나요?
수만 줄까지 잘 처리합니다. JavaScript의 Set은 평균 O(1) 조회 시간을 가지므로, 현대 하드웨어에서 100,000줄 중복 제거는 100밀리초 이내에 완료됩니다. 수 메가바이트 이상의 파일은 awk '!seen[$0]++' 원라이너를 명령줄에서 사용하세요. 파일 전체를 메모리에 올리지 않고 스트리밍 방식으로 처리합니다.
대소문자 구분 없는 중복 제거는 어떻게 작동하나요?
대소문자 구분이 꺼지면 각 줄을 소문자로 변환한 후 이미 등장한 줄 집합과 비교합니다. 첫 번째 등장의 원래 대소문자 형태가 출력에 유지됩니다. 예를 들어 입력에 1번 줄에 "Apple", 5번 줄에 "apple"이 있으면 "Apple"은 유지되고 "apple"은 제거됩니다.
중복 제거와 정렬을 동시에 할 수 있나요?
이 도구는 줄 순서를 변경하지 않고 중복을 제거합니다. 정렬된 고유 출력이 필요하면, 같은 카테고리의 줄 정렬 도구로 먼저 텍스트를 정렬한 후, 정렬된 결과를 여기에 붙여넣어 남은 중복을 제거하세요. 또는 명령줄에서 sort -u를 사용하면 한 번에 해결됩니다.
빈 줄과 공백만 있는 줄은 어떻게 처리되나요?
빈 줄은 다른 줄과 동일하게 처리됩니다. 텍스트에 빈 줄이 세 개 있으면 첫 번째만 유지됩니다. 공백 제거가 켜져 있으면 공백이나 탭만 있는 줄은 비교 전 빈 문자열로 정규화되므로, 첫 번째 빈 줄 또는 공백만 있는 줄의 중복으로 처리됩니다.
CSV 파일에서 특정 열 기준으로 중복을 제거하려면 어떻게 하나요?
이 도구는 개별 열이 아닌 전체 줄을 비교합니다. 특정 열 기준으로 CSV를 중복 제거하려면 필드 구분자와 함께 awk를 사용하세요. awk -F',' '!seen[$2]++' file.csv는 두 번째 열에 중복 값이 있는 행을 제거합니다. Python에서는 pandas를 사용하세요: df.drop_duplicates(subset=['column_name']). SQL 데이터의 경우 대상 열에 SELECT DISTINCT 또는 GROUP BY를 사용하세요.