개요
리눅스 환경에서 두 텍스트 파일 간의 공통 데이터와 차이점을 한눈에 파악할 수 있는 comm 명령어의 핵심 사용법을 실습합니다. 기본 3컬럼 출력 구조의 원리부터 옵션을 활용한 교집합/차집합 필터링, 정렬된 데이터를 다루는 실무 테크닉까지 단계별로 안내합니다.
1. comm 명령어의 기본 동작과 3개 컬럼 출력 이해하기
comm 명령어 실습을 위한 전용 작업 디렉터리를 생성하고 이동하기 위해 mkdir -p ~/comm_lab && cd ~/comm_lab 명령어를 실행합니다.

비교 실습에 사용할 알파벳순으로 정렬된 첫 번째 샘플 파일 fruits_a.txt를 생성하기 위해 printf "apple\nbanana\ncherry\nmango\n" > fruits_a.txt 명령어를 실행합니다.

첫 번째 파일과 대조할 정렬된 두 번째 샘플 파일 fruits_b.txt를 생성하기 위해 printf "banana\ncherry\norange\nwatermelon\n" > fruits_b.txt 명령어를 실행합니다.

comm 명령어는 사전 정렬된 두 텍스트 파일을 한 줄씩 비교하여 3개의 열(Column)로 결과를 구분해 출력합니다.
실행 결과에서 1열(들여쓰기 없음)은 첫 번째 파일에만 존재하는 라인, 2열(탭 1개)은 두 번째 파일에만 존재하는 라인, 3열(탭 2개)은 두 파일 모두에 공통으로 존재하는 라인을 나타냅니다.
⚙️ [주요 옵션]
-1 : 첫 번째 파일에만 존재하는 라인(1열)의 출력을 생략합니다.-2 : 두 번째 파일에만 존재하는 라인(2열)의 출력을 생략합니다.-3 : 두 파일 모두에 공통으로 존재하는 라인(3열)의 출력을 생략합니다.--check-order : 입력 파일이 올바르게 정렬되어 있는지 검증합니다.--nocheck-order : 입력 파일의 정렬 여부를 검사하지 않습니다.--output-delimiter=STR : 열 구분자로 기본 탭 문자 대신 지정한 문자열(STR)을 사용합니다.

2. 숫자 옵션을 활용한 교집합과 차집합 라인 필터링
실습 대상 파일들이 위치한 작업 디렉터리로 이동하기 위해 cd ~/comm_lab 명령어를 실행합니다.

comm -12 명령어는 1열과 2열의 출력을 생략하여 두 파일에 공통으로 존재하는 라인(교집합)만 추출합니다.
실행 결과 두 파일 모두에 포함된 banana와 cherry가 출력됩니다.

comm -23 명령어는 2열과 3열의 출력을 생략하여 첫 번째 파일에만 존재하는 고유 라인(차집합)을 추출합니다.
실행 결과 fruits_a.txt 파일에만 존재하는 apple과 mango가 출력됩니다.

comm -13 명령어는 1열과 3열의 출력을 생략하여 두 번째 파일에만 존재하는 고유 라인(차집합)을 추출합니다.
실행 결과 fruits_b.txt 파일에만 존재하는 orange와 watermelon이 출력됩니다.

3. 정렬되지 않은 파일 비교: Bash 프로세스 치환 활용하기
실습 파일들이 위치한 작업 디렉터리로 이동하기 위해 cd ~/comm_lab 명령어를 실행합니다.

정렬되지 않은 파일 비교 실습을 위해 첫 번째 샘플 파일 unsorted_a.txt를 생성하고자 printf "zebra\napple\ngrape\n" > unsorted_a.txt 명령어를 실행합니다.

대조 실습에 사용할 두 번째 비정렬 샘플 파일 unsorted_b.txt를 생성하고자 printf "apple\norange\nzebra\n" > unsorted_b.txt 명령어를 실행합니다.

comm <(sort unsorted_a.txt) <(sort unsorted_b.txt) 명령어는 Bash 프로세스 치환(<(...))을 사용하여 원본 파일을 변경하거나 별도의 임시 파일을 만들지 않고 즉석에서 정렬된 결과를 comm 명령어의 입력으로 전달합니다.
실행 결과 정렬된 데이터를 바탕으로 1열에는 첫 번째 파일에만 있는 grape, 2열에는 두 번째 파일에만 있는 orange, 3열에는 두 파일 모두에 존재하는 apple과 zebra가 정상적으로 구분되어 출력됩니다.

comm -12 <(sort unsorted_a.txt) <(sort unsorted_b.txt) 명령어는 프로세스 치환으로 정렬된 데이터를 전달받은 뒤 -12 옵션을 적용하여 1열과 2열을 제외하고 공통 라인만 출력합니다.
실행 결과 정렬되지 않은 원본 파일 환경에서도 임시 파일 생성 없이 두 파일의 공통 항목인 apple과 zebra가 교집합으로 깔끔하게 추출됩니다.

4. 실무 패키지 목록 비교 및 대소문자 무시 정렬 비교
실습 파일들이 위치한 작업 디렉터리로 이동하기 위해 cd ~/comm_lab 명령어를 실행합니다.

서버 간 패키지 비교 실습을 위해 첫 번째 서버의 패키지 목록 샘플 파일 server1_pkgs.txt를 생성하고자 printf "curl\ngit\nnginx\nvim\n" > server1_pkgs.txt 명령어를 실행합니다.

대조할 두 번째 서버의 패키지 목록 샘플 파일 server2_pkgs.txt를 생성하고자 printf "docker\ngit\npython3\nvim\n" > server2_pkgs.txt 명령어를 실행합니다.

comm -3 server1_pkgs.txt server2_pkgs.txt 명령어는 공통 항목(3열)을 제외하고 각 파일에만 존재하는 고유 항목들(1열과 2열)만 비교하여 출력합니다.
실행 결과 두 서버에 공통으로 설치된 git과 vim은 제외되고, 첫 번째 서버에만 설치된 curl과 nginx, 두 번째 서버에만 설치된 docker와 python3가 구분되어 출력됩니다.

대소문자가 섞인 비교 실습을 위해 첫 번째 샘플 파일 mixed_a.txt를 생성하고자 printf "Apple\nBANANA\ncherry\n" > mixed_a.txt 명령어를 실행합니다.

대조 실습에 사용할 대소문자 혼합 두 번째 샘플 파일 mixed_b.txt를 생성하고자 printf "apple\nbanana\nCHERRY\n" > mixed_b.txt 명령어를 실행합니다.

comm -12 --nocheck-order <(sort -f mixed_a.txt) <(sort -f mixed_b.txt) 명령어는 sort -f 옵션으로 대소문자 구분 없이 항목을 정렬한 뒤, comm 명령어의 정렬 검증 오류를 방지하기 위해 --nocheck-order 옵션을 적용하여 공통 라인만 추출합니다.
실행 결과 comm은 기본적으로 바이트 단위의 엄격한 일치 여부를 대조하므로, 정렬은 대소문자 무시 순서로 맞추어졌으나 실제 문자열의 대소문자가 서로 달라 완전 일치하는 공통 라인이 없어 아무것도 출력되지 않습니다.

지금까지 리눅스 comm 명령어를 활용해 두 파일의 공통 라인과 차이점을 비교하고 원하는 열만 필터링하는 방법을 살펴보았습니다.
정렬(sort)된 텍스트와 다양한 옵션을 적절히 조합해 대용량 목록이나 로그 데이터를 효율적으로 분석해 보시기 바랍니다.