~ / posts / text

목록 중복 제거와 정렬, 엑셀·구글시트 방법과 대소문자·공백 함정 비교

목록 중복 제거는 무엇을 같은 값으로 볼지가 핵심이에요. 이메일 14줄이 기준에 따라 고유값 11개에서 6개까지 달라지는 예시와, 엑셀 중복 제거·UNIQUE·COUNTIF, 구글시트, 명령줄 방법의 차이와 함정을 정리했어요.

행사 세 번의 참가자 명단을 합쳐서 실제 인원이 몇 명인지 세려는데, 엑셀 "중복된 항목 제거"를 눌러도 같은 사람이 두 번씩 남아 있던 적이 있어요. 알고 보니 한쪽 명단의 이메일 끝에 공백이 붙어 있었습니다. 중복 제거에서 제일 중요한 건 버튼이 아니라 무엇을 같은 값으로 볼지(대소문자, 앞뒤 공백, 중간 공백, 빈 줄) 먼저 정하고, 그 기준에 맞게 값을 정규화한 뒤 지우는 것이에요. 이 순서만 지키면 엑셀이든 구글 시트든 웹 도구든 결과가 같아집니다.

이 글에서는 실제 이메일 목록 하나로 기준마다 결과가 어떻게 달라지는지 보여 드리고, 엑셀·구글 시트·명령줄·코드로 중복을 지우는 방법과 각각의 함정, 정렬할 때 주의할 점까지 정리했어요. 예시 결과는 텍스트 중복 제거 도구의 옵션과 같은 규칙으로 계산했습니다.

핵심 요약

같은 14줄 목록도 비교 기준에 따라 고유값이 11개에서 6개까지 달라져요.

엑셀 중복 제거와 UNIQUE 함수는 대소문자를 무시하지만 앞뒤 공백은 다른 값으로 봅니다.

구글 시트 UNIQUE 함수는 대소문자를 구분하니, 엑셀과 결과가 다를 수 있어요.

수만 줄 이상에서 COUNTIF로 중복을 찾으면 계산이 급격히 느려지니, 정렬이나 해시 방식 도구를 쓰는 게 좋아요.

중복 제거, 기준에 따라 결과가 달라진다

아래 14줄은 여러 명단을 합친 이메일 목록이에요. 실제 사람은 6명입니다.

kim@example.com
lee@example.com
Kim@Example.com
park@example.com
lee@example.com␣        ← 끝에 공백
choi@example.com
                        ← 빈 줄
kim@example.com
jung@example.com
PARK@example.com
choi@example.com
han@example.com
lee @example.com        ← 중간에 공백
jung@example.com

이걸 비교 기준을 하나씩 늘려 가며 중복 제거해 보면 결과가 이렇게 바뀝니다.

같은 이메일 14줄, 비교 기준별 남는 고유값 수
그대로 비교그대로 비교 · 11개11개빈 줄 제거빈 줄 제거 · 10개10개+ 앞뒤 공백 무시+ 앞뒤 공백 무시 · 9개9개+ 대소문자 무시+ 대소문자 무시 · 7개7개+ 모든 공백 무시+ 모든 공백 무시 · 6개6개

실제 인원 6명이 나오려면 네 가지 기준을 모두 켜야 해요

단위: 개 · 자료: 위 예시 목록을 텍스트 중복 제거 도구와 같은 규칙으로 파이썬에서 직접 계산
표로 보기
구분고유값
그대로 비교11
빈 줄 제거10
+ 앞뒤 공백 무시9
+ 대소문자 무시7
+ 모든 공백 무시6

이메일 주소는 표준상 @ 앞부분이 대소문자를 구분할 수 있지만, 실제 메일 서비스는 거의 다 구분하지 않아요. 그래서 명단 정리에서는 대소문자 무시를 켜는 게 현실적입니다. 반대로 상품 코드나 비밀번호처럼 대소문자가 의미 있는 값이라면 꺼야 해요. 기준은 데이터의 의미에 따라 정하는 거지, 결과 숫자를 줄이려고 정하는 게 아니에요.

엑셀에서 중복값 제거하는 3가지 방법

1. 데이터 탭의 중복된 항목 제거

가장 많이 쓰는 방법이에요. 범위를 선택하고 데이터 → 중복된 항목 제거를 누르면, 고른 열 기준으로 첫 번째 행만 남기고 나머지를 지웁니다. 빠르지만 알아 둘 점이 있어요.

2. UNIQUE 함수 (Microsoft 365, 엑셀 2021 이상)

=UNIQUE(A2:A100)을 쓰면 원본은 그대로 두고 옆에 고유값 목록이 생겨요. =SORT(UNIQUE(A2:A100))처럼 정렬과 묶을 수 있고, 세 번째 인수를 TRUE로 주면 딱 한 번만 나온 값만 뽑아 줍니다. 공백 문제까지 해결하려면 =UNIQUE(TRIM(A2:A100))처럼 먼저 정리한 값을 넣으면 돼요. 단, TRIM은 NBSP를 못 지우니 웹에서 복사한 데이터라면 복사한 텍스트의 줄바꿈·공백 정리법에 있는 SUBSTITUTE 수식을 함께 쓰세요.

3. COUNTIF로 중복 표시만 하기

지우지 않고 어떤 값이 중복인지 보고 싶을 때는 옆 열에 =COUNTIF($A$2:$A$100,A2)를 넣어요. 2 이상이면 중복입니다. 홈 → 조건부 서식 → 셀 강조 규칙 → 중복 값을 쓰면 색으로 바로 표시되고요. 회원 명단의 중복 가입, 설문 중복 응답을 찾을 때 유용해요.

구글 시트에서 중복 삭제하기

구글 시트는 데이터 → 데이터 정리 → 중복 항목 삭제 메뉴가 있고, 같은 메뉴의 공백 제거로 앞뒤 공백을 먼저 정리할 수 있어요. 함수는 엑셀과 이름이 같은 =UNIQUE(A2:A)를 씁니다.

여기서 함정이 하나 있어요. 구글 시트의 UNIQUE는 대소문자를 구분합니다. 같은 데이터를 엑셀 UNIQUE에 넣으면 7개(공백 정리 후), 구글 시트 UNIQUE에 넣으면 9개가 나올 수 있어요. 대소문자를 무시하려면 =UNIQUE(LOWER(TRIM(A2:A)))처럼 소문자로 바꾼 값을 넣으세요. 원래 표기를 보존해야 한다면 소문자 값을 키로 쓰는 보조 열을 따로 두는 편이 안전합니다.

방법대소문자앞뒤 공백원본 변경중복만 보기
엑셀 중복된 항목 제거무시구분바뀜X
엑셀 UNIQUE무시구분유지한 번만 나온 값 O
구글 시트 중복 항목 삭제메뉴 옵션 확인공백 제거 메뉴 별도바뀜X
구글 시트 UNIQUE구분구분유지한 번만 나온 값 O
텍스트 중복 제거 도구옵션옵션유지중복만·한 번만 O
중복 제거 전 결정할 것 네 가지: 대소문자, 공백, 남길 행, 정렬 기준과 각 선택에 따른 결과 예시
지우기 전에 같은 값의 기준부터 정하기

수만 줄 이상이면 COUNTIF가 느린 이유

COUNTIF로 중복을 표시하는 방법은 편하지만, 행마다 전체 범위를 처음부터 끝까지 훑어요. 행이 n개면 비교가 대략 n × n번 일어나는 셈이라, 행이 10배 늘면 계산은 100배 늘어납니다.

10만 줄에서 중복을 찾을 때 필요한 비교 횟수 (방식별 이론값)
행마다 전체 비교(COUNTIF)행마다 전체 비교(COUNTIF) · 10,000백만 번10,000백만 번정렬 후 이웃 비교정렬 후 이웃 비교 · 1.7백만 번1.7백만 번해시(Set·딕셔너리)해시(Set·딕셔너리) · 0.1백만 번0.1백만 번

정렬이나 해시 방식은 COUNTIF 방식보다 수천 배 적게 비교해요

단위: 백만 번 · 자료: n=100,000일 때 n², n·log₂n, n 으로 직접 계산 (상수 계수 제외한 어림값)
표로 보기
구분비교 횟수
행마다 전체 비교(COUNTIF)10,000
정렬 후 이웃 비교1.7
해시(Set·딕셔너리)0.1

10만 줄이면 COUNTIF 방식은 약 100억 번, 정렬 방식은 약 170만 번, 해시 방식은 10만 번 정도예요. 엑셀이 수식 계산 중에 멈춘 것처럼 보이는 이유가 이거예요. 텍스트 중복 제거 도구는 값을 해시 맵에 넣어 한 번만 훑기 때문에, 브라우저 안에서 수십만 줄도 대부분 1초 안에 끝납니다. 엑셀에서도 UNIQUE나 중복된 항목 제거 기능은 내부적으로 더 효율적인 방식을 써서 COUNTIF보다 훨씬 빨라요.

정렬할 때 생기는 함정: item10이 item2보다 앞에?

중복을 지운 뒤에는 대개 정렬을 하죠. 이때 자주 만나는 문제가 있어요.

눈에 똑같은데 중복으로 안 잡힐 때: 한글 정규화

맥에서 만든 파일 이름이나 일부 앱에서 복사한 한글은 "가"를 한 글자(완성형, NFC)가 아니라 "ㄱ+ㅏ" 두 글자(조합형, NFD)로 저장하는 경우가 있어요. 화면엔 똑같이 보이지만 컴퓨터에겐 다른 문자열이라 중복 제거, 검색, VLOOKUP이 모두 실패합니다. 코드 포인트 길이를 재 보면 티가 나요. 자바스크립트 "가나다".length 나 파이썬 len() 이 3이 아니라 6으로 나오면 NFD예요. 눈에 보이는 글자 단위로 세는 도구에서는 둘 다 3자로 나오니 주의하세요. 코드에서는 비교 전에 정규화(JavaScript str.normalize('NFC'), 파이썬 unicodedata.normalize('NFC', s))를 해 주면 해결됩니다.

명령줄과 코드로 중복 제거하기

데이터가 파일로 있거나 반복 작업이라면 코드 한 줄이 제일 빠릅니다.

sort -u list.txt                 # 정렬 + 중복 제거
awk '!seen[$0]++' list.txt       # 원래 순서 유지하며 중복 제거
sort list.txt | uniq -c | sort -rn   # 빈도표 (많이 나온 순)
sort list.txt | uniq -d          # 중복된 줄만
items = [l.strip().lower() for l in open('list.txt', encoding='utf-8') if l.strip()]
unique = list(dict.fromkeys(items))    # 순서 유지 중복 제거
const unique = [...new Set(lines.map(l => l.trim().toLowerCase()).filter(Boolean))];

sort -u는 결과가 정렬되고, awk '!seen[$0]++'는 처음 나온 순서를 지켜요. 파이썬 dict.fromkeys와 자바스크립트 Set도 삽입 순서를 유지합니다. 공통점은 비교 전에 trim과 소문자 변환으로 키를 만든다는 거예요. 데이터베이스라면 SELECT DISTINCT, 중복만 찾을 땐 GROUP BY 컬럼 HAVING COUNT(*) > 1을 씁니다.

상황별 추천 설정

상황대소문자앞뒤 공백모든 공백결과 보기
이메일·도메인 명단무시무시무시고유한 줄
전화번호·계좌번호해당 없음무시무시고유한 줄
상품 코드·ID구분무시구분중복된 줄만(오류 찾기)
블로그 태그·키워드무시무시구분많이 나온 순 + 횟수
두 목록 비교상황별무시상황별중복만 = 교집합, 한 번만 = 한쪽에만 있는 값

두 목록을 비교할 때는 각 목록에서 먼저 중복을 지운 뒤 이어 붙여야 해요. 그래야 "중복된 줄만"이 두 목록에 모두 있는 값(교집합)이 되고, "한 번만 나온 줄"이 한쪽에만 있는 값이 됩니다. 한 목록 안에 이미 중복이 있으면 그게 교집합으로 잘못 잡혀요.

자주 묻는 질문

엑셀 중복된 항목 제거를 했는데 중복이 남아 있어요.

대부분 앞뒤 공백이나 NBSP 같은 보이지 않는 문자 때문이에요. TRIM 수식이나 공백 제거 도구로 먼저 정리한 뒤 다시 중복 제거하세요. 대소문자는 엑셀이 이미 무시하니 원인이 아닙니다.

구글 시트 UNIQUE 결과가 엑셀과 달라요.

구글 시트 UNIQUE는 대소문자를 구분하고, 엑셀 UNIQUE는 구분하지 않기 때문이에요. 구글 시트에서 대소문자를 무시하려면 =UNIQUE(LOWER(TRIM(A2:A)))처럼 소문자로 바꾼 값을 넣으세요.

중복을 지우지 않고 어떤 값이 중복인지 보고 싶어요.

엑셀은 조건부 서식의 중복 값 강조나 COUNTIF 열을 쓰면 되고, 텍스트 중복 제거 도구에서는 결과 보기를 "중복된 줄만"으로 바꾸면 두 번 이상 나온 값만 보여 줘요. 등장 횟수 표시를 켜면 몇 번 나왔는지도 함께 나옵니다.

두 목록에서 겹치는 값만 찾으려면 어떻게 하나요?

각 목록에서 먼저 중복을 제거하고, 두 목록을 이어 붙인 다음 "중복된 줄만"을 고르세요. 두 목록에 모두 있는 값만 남아요. 엑셀에서는 COUNTIF로 다른 목록에 있는지 세는 방법도 있습니다.

원래 순서를 유지하면서 중복만 지울 수 있나요?

네. 정렬을 "원래 순서"로 두면 처음 나온 줄의 위치가 그대로 유지돼요. 명령줄에서는 sort -u 대신 awk '!seen[$0]++'를 쓰면 순서가 유지됩니다.

정리

중복 제거는 "같은 값"의 기준을 먼저 정하는 일이에요. 대소문자, 앞뒤 공백, 중간 공백, 빈 줄을 어떻게 볼지 정하고 값을 정리한 뒤 지우면, 엑셀이든 구글 시트든 도구든 같은 결과가 나옵니다. 엑셀은 대소문자 무시·공백 구분, 구글 시트 UNIQUE는 대소문자 구분이라는 차이만 기억해 두면 결과가 왜 다르냐는 고민이 줄어요.

열을 복사해서 기준을 바꿔 가며 바로 확인하려면 텍스트 중복 제거를 써 보세요. 정리한 목록을 쉼표로 이어야 하면 줄바꿈 제거기의 구분자로 잇기, 변수명 목록이라면 camelCase·snake_case 네이밍 컨벤션도 함께 보세요.

#중복 제거#엑셀 중복값 제거#구글시트 중복 삭제#UNIQUE 함수#중복값 찾기#목록 정렬#이메일 명단 정리#COUNTIF 중복
← 이전 글PDF·카톡 복사 텍스트 줄바꿈 공백 정리법, NBSP·전각 공백까지 한 번에