캠페인 발송 전에 이메일 리스트 정렬
마케팅이 구독자 이메일 CSV를 캠페인 도구에 붙여 넣지만 리스트는 가입 순서로 도착합니다. 실제로는 이메일 로컬 파트가 대소문자에 둔감하므로, 여기서 대소문자 미구분으로 알파벳 정렬을 먼저 한 다음 dedupe 합니다. 캠페인 도구의 import이 더 빨라지고, gmial.com 같이 잘못 친 도메인은 정상 gmail.com 블록 옆에 자리 잡으니 바로 눈에 띕니다.
리스트를 붙여 넣고 순서를 고른 뒤 정렬된 결과를 받습니다. 대소문자 구분 여부, 오름차순 또는 내림차순, 파일명과 버전 문자열용 natural sort까지 지원합니다.
텍스트 블록을 받아 줄바꿈으로 나누고 줄을 정렬해 결과를 돌려주는, 브라우저에서 도는 무료 도구입니다. 가입도 업로드도 필요 없고, 무엇도 기기 밖으로 나가지 않습니다. 붙여 넣고, 클릭하고, 복사하면 됩니다.
커맨드라인에서 sort를 실행하는 것과 같지만, LC_COLLATE와 씨름하거나 macOS가 옛날 BSD sort를 가지고 다닌다는 사실, 또는 Windows에는 Git Bash를 깔지 않으면 sort가 아예 없다는 사실에 휘둘리지 않아도 됩니다. 체크박스 세 개로 실제로 필요한 경우를 모두 덮습니다: 오름차순/내림차순, 대소문자 구분 여부, 그리고 file2가 file10보다 앞에 오도록 하는 natural sort입니다.
package.json에 의존성 리스트를 붙여 넣었더니 다음 install에서 npm이 다시 정렬해 놓은 적이 있다면, 이 도구는 npm 7+가 하는 동작을 그대로 재현하므로 CI가 돌 때 diff가 비어 있게 만들 수 있습니다.
내부적으로 이 도구는 브라우저의 Intl.Collator API를 사용합니다. 이는 Unicode Collation Algorithm (UTS #10)이 정의하는 방식대로, 단순한 codepoint 비교가 아니라 Unicode를 이해하는 비교 함수를 줍니다. 실용적인 차이로, Intl.Collator는 é가 e의 옆으로 정렬되고, 독일어 ß가 1차 레벨에서 ss와 같다고 비교되며, 대문자와 소문자는 3차 레벨에서만 차이가 난다는 사실을 알고 있습니다.
lexicographic sort와 로케일 기반 sort는 다릅니다. 순수 codepoint sort(LC_ALL=C sort가 주는 동작)는 모든 대문자를 모든 소문자보다 앞에 둡니다. A가 U+0041이고 a가 U+0061이기 때문입니다. Unicode 기본 collation sort는 그것들을 섞어 둡니다: A < a < B < b < C. Excel이나 Google Sheets에서 Sort A-Z를 눌렀을 때 사람들이 기대하는 순서이므로, 기본값은 로케일을 따르는 순서로 두었습니다. codepoint 스타일 정렬로 돌아가려면 대소문자 구분 체크박스를 켜세요.
natural sort가 세 번째 축입니다. 켜면 file2.log가 file10.log보다 앞에 오는데, 안에 들어 있는 숫자를 글자 단위가 아니라 숫자로 비교하기 때문입니다. 배경 지식이 필요하면 Wikipedia에 자연 정렬에 대한 깔끔한 설명이 있습니다. 구현은 Intl.Collator의 numeric: true 옵션이며, Finder, Windows Explorer, 최신 GNU sort -V가 사용하는 것과 같은 프리미티브입니다.
입력 패널 하나, 출력 패널 하나. 모두 로컬에서 도는 동작입니다. 탭을 닫으면 텍스트는 사라집니다.
에디터에 리스트를 떨어뜨리세요, 한 줄에 한 항목입니다. 끝에 빈 줄이 남아도 괜찮습니다. CRLF와 LF 모두 동작하며, 별도 지정이 없으면 출력은 LF로 정규화됩니다. 세 옵션이 어떻게 동작하는지 먼저 보고 싶다면 Sample 버튼이 작은 혼합 리스트로 에디터를 채워 줍니다.
오름차순 또는 내림차순을 고르고, Apple이 banana보다 앞에 오게 해야 한다면 대소문자 구분을 켜고, 파일명이나 버전이 섞여 있을 때는 Natural sort를 켜세요. 빈 줄 제거는 정렬 전에 빈 줄을 버리고, 중복 제거는 같은 줄을 하나로 합칩니다.
Sort를 누르세요. 결과가 출력 패널에 나타납니다. 복사로 클립보드에 담거나 다운로드로 .txt 파일로 저장하세요. 헤더의 줄 수 카운터는 결과 줄 수를 보여 주므로, 중복 제거를 켰을 때 몇 개가 사라졌는지 알고 싶을 때 유용합니다.
마케팅이 구독자 이메일 CSV를 캠페인 도구에 붙여 넣지만 리스트는 가입 순서로 도착합니다. 실제로는 이메일 로컬 파트가 대소문자에 둔감하므로, 여기서 대소문자 미구분으로 알파벳 정렬을 먼저 한 다음 dedupe 합니다. 캠페인 도구의 import이 더 빨라지고, gmial.com 같이 잘못 친 도메인은 정상 gmail.com 블록 옆에 자리 잡으니 바로 눈에 띕니다.
PR diff를 깔끔하게 유지하려고 class="..." 속성의 클래스 이름을 알파벳순으로 강제하는 팀이 있습니다. 값을 붙여 넣고, 정렬하고, 다시 붙여 넣으면 됩니다. 같은 방식이 lint가 불평하는 HTML 속성 순서나, 리포에 prettier-plugin-tailwindcss가 없을 때 손으로 Tailwind 유틸리티 클래스를 정렬할 때도 통합니다.
모두가 줄을 덧붙이는 .gitignore는 어느새 잡동사니 서랍이 됩니다. 한 번 알파벳순으로 정렬해서 커밋해 두면, 이후 추가는 자연스러운 자리에 들어가고 리뷰어에게도 diff가 말이 됩니다. .dockerignore, .eslintignore, 팀이 유지하는 tsconfig.json의 files 배열에도 똑같이 적용됩니다.
Slack과 Discord는 이상한 순서, 절반쯤 비어 있는 줄, 같은 말을 두 번 한 사람이 만든 중복까지 포함해서 리스트를 떨어뜨립니다. 붙여 넣고, Remove blank lines와 Remove duplicates를 켜고, 정렬하세요. 작업 트래커에 떨어뜨릴 깔끔하게 정렬된 리스트가 나옵니다.
ISO 3166 국가 코드, IATA 공항 코드, ISO 4217 통화 코드. 모두 정렬해 둘 때 이득을 보는 lookup 파일에 삽니다. 코드는 고정 길이이므로 natural sort는 필요 없지만, 일부 출처가 USD와 usd를 섞어 쓰기 때문에 대소문자 미구분은 중요합니다. 정렬, dedupe, lookup 테이블에 다시 붙여 넣기.
package.json의 의존성 키는 npm 7+가 install 때마다 알파벳순으로 정리하지만, 아직 npm 6(또는 yarn 1)에 고정된 프로젝트를 다루고 있다면 순서가 자동으로 바뀌지 않습니다. 의존성 키를 붙여 넣고 A-Z로 정렬한 뒤 다시 붙여 넣으세요. 다음 PR에는 실제 변경 위에 200줄짜리 재정렬 커밋이 얹히지 않습니다.
이 도구가 노출하는 sort 옵션과 그것들이 다루는 엣지 케이스에 대한 짧은 치트시트입니다.
| Topic | What this tool does |
|---|---|
| lexicographic vs collation | lexicographic(codepoint) 정렬은 원본 Unicode 값으로 정렬합니다: A (U+0041)가 a (U+0061)보다 앞. collation 정렬은 Unicode Collation Algorithm을 따라 대소문자를 섞어 둡니다. 이 도구는 기본으로 collation을 사용합니다. codepoint 순서가 필요하면 Case-sensitive를 켜세요. |
| 대소문자 민감도 | 기본은 미구분: apple, Apple, APPLE이 같다고 비교됩니다. 구분 모드로 바꾸면 collation 3차 레벨에서 A < a < B < b 순서가 되거나, C 로케일과 결합하면 원본 codepoint 순서가 됩니다. |
| natural sort | 켜면 2와 10이 숫자로 비교되어 file2 < file10이 됩니다. 끄면 1 (U+0031)이 2 (U+0032)보다 글자 단위로 작아 file10 < file2가 됩니다. 파일명, 버전 문자열, 그 밖에 숫자가 섞인 어떤 리스트에도 사용하세요. |
| 로케일 인식 | 정렬은 페이지 로케일을 따릅니다. 프랑스어에서는 é가 e 옆에 정렬되고, 독일어 ä는 DIN 5007-2 전화번호부 순서에서 ae로 정렬되는 식입니다. unix의 sort 명령도 LC_COLLATE가 설정되어 있으면 같은 일을 합니다. LC_ALL=C sort는 codepoint 순서로 떨어지며, 더 빠르지만 악센트는 외래 문자 취급을 받습니다. |
| 빈 줄 처리 | 오름차순에서 빈 줄은 비어 있지 않은 어떤 줄보다도 앞에 정렬되어 위쪽에 모입니다. 완전히 떨어뜨리려면 Remove blank lines를 켜세요. 입력 끝의 마지막 개행은 그대로 유지되어, 출력이 cat이나 비슷한 도구를 거쳐도 깔끔하게 왕복합니다. |
| 안정성 | 정렬은 안정적입니다: 설정 아래에서 같다고 비교되는 줄들은 원래의 상대 순서를 지킵니다. 접두사로 정렬하거나 대소문자 미구분 모드에서 동률 그룹 안의 입력 순서를 유지하고 싶을 때 의미가 있습니다. V8(Chrome, Edge, Node)과 SpiderMonkey(Firefox) 모두 2019년부터 안정적인 Array.prototype.sort를 보장합니다. |
| 줄 끝(LF vs CRLF) | 입력은 \r\n, \n, \r로 분할됩니다. 출력은 기본으로 \n으로 결합되어 Linux와 macOS 워크플로에 깔끔하게 붙습니다. Windows 도구에 CRLF가 필요하면 결과를 Windows를 인식하는 에디터에 붙여 넣고 원하는 줄 끝으로 저장하세요. |
| 인코딩 | 입력은 UTF-8로 처리됩니다(브라우저 안의 텍스트는 이미 디코딩된 상태입니다). 첫 줄에 UTF-8 BOM이 있다면 그대로 보존됩니다. 떼고 싶다면 자매 도구인 whitespace-cleaner가 제거해 줍니다. |
브라우저의 Intl.Collator를 페이지 로케일로 사용하는, 로케일을 따르는 오름차순입니다. 이는 모든 대문자가 모든 소문자보다 앞에 오는 codepoint 순이 아니라, Excel과 Google Sheets가 정렬하는 것과 같은 A < a < B < b 순서를 의미합니다. codepoint 순서가 필요하다면 대소문자 구분 옵션을 켜세요. collator를 엄격한 3차 레벨 비교로 바꾸어 LC_ALL=C sort와 같은 순서를 줍니다.
기본은 미구분입니다. Apple, apple, APPLE이 모두 같은 키로 합쳐져 출력에서 모여 있고, 그 안의 상대 순서는 입력에서 먼저 나온 순서를 따릅니다(정렬은 안정 정렬입니다). 대소문자 구분을 켜면 분리되어, APPLE, Apple, apple이 Unicode 기본 collation의 3차 레벨에 따라 서로 다른 세 값으로 정렬됩니다.
네. Natural sort 옵션을 켜면 안에 들어 있는 숫자가 숫자로 비교되어 file2.log가 file10.log보다 앞에 오고, v1.9가 v1.10보다 앞에 옵니다. 구현은 Intl.Collator의 numeric: true 옵션으로, macOS Finder와 Windows Explorer가 파일명을 정렬할 때 쓰는 같은 프리미티브입니다.
네. 순서 토글에서 내림차순을 고르세요. 정렬은 먼저 오름차순으로 돌고 그 다음에 뒤집습니다. 이렇게 하면 같은 키 사이에서도 안정성이 보존됩니다. 두 줄이 대소문자와 natural sort 설정 아래에서 같다고 비교된다면 뒤집은 뒤에도 원래의 상대 순서를 유지합니다. TSV의 첫 열 같은 부분 키로 정렬할 때 중요한 성질입니다.
기본적으로 둘 다 유지됩니다. 정렬은 안정적이라 중복은 원래의 상대 순서를 지키고, 빈 줄은 오름차순에서 위쪽에 모입니다(빈 줄이 비어 있지 않은 어떤 문자열보다도 앞에 정렬되기 때문입니다). 정렬 전에 빈 줄을 떨어뜨리려면 Remove blank lines를, 같은 줄을 하나로 합치려면 Remove duplicates를 켜세요. 더 많은 옵션이 있는 전용 dedupe 패스가 필요하면 중복 줄 제거를 사용하세요.
약 100,000줄까지는 브라우저에서 1초 이내에 끝납니다. 500,000줄을 넘기면 체감되기 시작하는데, 주로 정렬 자체가 아니라 결과 패널을 그리는 비용 때문입니다. 수백만 줄짜리 파일에는 unix의 sort 명령에 LC_ALL=C sort -u file.txt를 쓰는 편이 더 빠르고 메모리 밖에서도 동작합니다. 알아 둘 만한 플래그는 GNU coreutils sort 매뉴얼에 정리되어 있습니다.
여러분의 텍스트는 브라우저 밖으로 나가지 않습니다. 분할, 비교, 결합 모두 로컬에서 동작합니다. 입력에 대한 분석도, 로그도, 서버 왕복도 없습니다. 비교 자체는 Unicode Collation Algorithm (UTS #10)을 구현한, 브라우저 네이티브 Intl.Collator입니다. 배경 자료가 필요하면 Wikipedia에 정렬 알고리즘 일반에 대한 탄탄한 개요가 있습니다.