Linux join 명령어: 파일 결합하기

LinuxBeginner
지금 연습하기

소개

이 실습에서는 Linux 의 join 명령어를 사용하여 여러 파일의 데이터를 병합하는 방법을 배웁니다. 회사의 인사부에서 근무하며 서로 다른 데이터베이스에 흩어져 있는 직원 정보를 통합해야 하는 상황을 가정해 보겠습니다. 이 실무 연습을 통해 데이터 처리 작업에서 join 명령어가 가진 강력함과 유연성을 직접 확인하실 수 있습니다.

이 실습은 단계별 안내를 통해 학습과 연습을 돕는 가이드형 실습입니다. 각 단계를 주의 깊게 따라가며 실무 경험을 쌓으세요. 통계에 따르면 이 실습은 초급 수준으로, 98%의 높은 완료율을 기록하고 있습니다. 또한 학습자들로부터 99%의 긍정적인 평가를 받았습니다.

데이터 파일 확인하기

먼저 직원 데이터 파일의 내용을 살펴보겠습니다. 우리에게는 employees.txtsalaries.txt라는 두 개의 파일이 있습니다.

우선 프로젝트 디렉터리로 이동합니다:

cd /home/labex/project

이 명령어는 현재 작업 디렉터리를 /home/labex/project로 변경합니다. 이후의 모든 작업은 이 디렉터리 내에서 수행됩니다.

이제 employees.txt 파일의 내용을 확인해 보겠습니다:

cat employees.txt

cat 명령어는 파일의 내용을 화면에 출력합니다. 다음과 같은 결과가 나타날 것입니다:

1001 John Engineering
1002 Sarah Marketing
1003 Mike Sales
1004 Emily HR
1005 David Finance

각 행은 직원의 ID, 이름, 부서 정보를 담고 있습니다.

다음으로 salaries.txt 파일을 확인해 보겠습니다:

cat salaries.txt

출력 결과는 다음과 같아야 합니다:

1001 75000
1002 65000
1003 70000
1004 60000
1005 80000

이 파일에는 직원 ID 와 그에 해당하는 급여 정보가 들어 있습니다.

이 파일들은 서로 독립된 데이터베이스를 의미하며, 이제 join 명령어를 사용하여 이들을 하나로 합쳐볼 것입니다.

기본적인 결합 작업

데이터의 구조를 파악했으니, 이제 join 명령어를 사용하여 직원 ID 를 기준으로 두 파일의 정보를 병합해 보겠습니다.

다음 명령어를 실행하세요:

join employees.txt salaries.txt

다음과 같은 결과가 출력됩니다:

1001 John Engineering 75000
1002 Sarah Marketing 65000
1003 Mike Sales 70000
1004 Emily HR 60000
1005 David Finance 80000

내부적으로 어떤 작업이 일어났는지 분석해 보겠습니다:

  1. join 명령어는 두 파일의 첫 번째 필드 (직원 ID) 를 대조합니다.
  2. 일치하는 ID 를 찾으면 두 파일의 해당 행을 하나로 합칩니다.
  3. 출력 결과에는 직원 ID 가 먼저 나오고, 이어서 employees.txt의 나머지 필드들과 salaries.txt의 나머지 필드 (중복되는 ID 제외) 가 순서대로 표시됩니다.

이를 통해 각 직원의 전체 정보를 한 줄로 확인할 수 있습니다. join 명령어는 데이터가 여러 파일에 나뉘어 저장되어 있지만 이를 통합하여 분석하거나 조회해야 할 때 매우 유용합니다.

결합 출력 결과 사용자 정의하기

때로는 출력되는 필드의 순서를 바꾸거나 특정 필드만 포함하고 싶을 때가 있습니다. join 명령어 뒤에 필드 번호를 지정하여 이를 제어할 수 있습니다.

다음 명령어를 시도해 보세요:

join -o 1.2,1.3,2.2,1.1 employees.txt salaries.txt

결과는 다음과 같습니다:

John Engineering 75000 1001
Sarah Marketing 65000 1002
Mike Sales 70000 1003
Emily HR 60000 1004
David Finance 80000 1005

-o 옵션의 의미를 살펴보겠습니다:

  • -o는 "출력 형식 (output format)"을 의미합니다.
  • 1.2는 첫 번째 파일의 두 번째 필드 (이름) 를 의미합니다.
  • 1.3은 첫 번째 파일의 세 번째 필드 (부서) 를 의미합니다.
  • 2.2는 두 번째 파일의 두 번째 필드 (급여) 를 의미합니다.
  • 1.1은 첫 번째 파일의 첫 번째 필드 (직원 ID) 를 의미합니다.

이 옵션을 사용하면 출력되는 정보의 순서를 자유롭게 조정할 수 있습니다. 특정 보고서 형식에 맞춰 데이터를 재배열하거나 각 파일에서 필요한 정보만 골라낼 때 특히 유용합니다.

일치하지 않는 레코드 처리하기

실제 상황에서는 한쪽 파일에는 데이터가 있지만 다른 쪽 파일에는 대응하는 정보가 없는 경우가 발생할 수 있습니다. 아직 급여가 책정되지 않은 신입 사원을 추가하여 이 상황을 재현해 보겠습니다.

employees.txt에 다음 직원을 추가합니다:

echo "1006 Alex IT" >> employees.txt

>> 연산자는 기존 내용을 덮어쓰지 않고 파일의 끝에 새로운 행을 추가합니다.

이제 다시 기본 결합 명령어를 실행해 보겠습니다:

join employees.txt salaries.txt

출력 결과에서 Alex 를 찾을 수 없을 것입니다. salaries.txt에 Alex 의 ID(1006) 와 일치하는 레코드가 없기 때문입니다.

일치하는 데이터가 없는 레코드까지 포함하려면 -a 옵션을 사용합니다:

join -a 1 employees.txt salaries.txt

이제 출력 결과에 Alex 가 포함된 것을 확인할 수 있습니다:

1001 John Engineering 75000
1002 Sarah Marketing 65000
1003 Mike Sales 70000
1004 Emily HR 60000
1005 David Finance 80000
1006 Alex IT

-a 1 옵션은 첫 번째 파일 (employees.txt) 에서 짝이 맞지 않는 행도 모두 포함하라고 join 명령어에 지시합니다. 이는 상대 파일에 매칭되는 정보가 없더라도 기준이 되는 파일의 모든 데이터를 보고 싶을 때 유용합니다.

다른 필드를 기준으로 결합하기

지금까지는 첫 번째 필드 (직원 ID) 를 기준으로 파일을 결합했습니다. 하지만 다른 필드를 기준으로 결합해야 한다면 어떻게 해야 할까요? 파일 구조가 다르거나 ID 가 아닌 공통 속성 (예: 부서명) 을 기준으로 데이터를 합쳐야 할 때 이 방법이 필요합니다.

부서 코드가 담긴 departments.txt라는 새 파일을 만들어 보겠습니다:

cat << EOF > departments.txt
Engineering ENG
Marketing MKT
Sales SLS
HR HRS
Finance FIN
IT ITS
EOF

이 명령어는 부서 이름과 해당 코드가 포함된 departments.txt 파일을 생성합니다.

이제 부서 이름을 기준으로 이 파일과 employees.txt 파일을 결합해 보겠습니다:

join -1 3 -2 1 employees.txt departments.txt

결과는 다음과 같습니다:

Engineering 1001 John ENG
Marketing 1002 Sarah MKT
Sales 1003 Mike SLS
HR 1004 Emily HRS
Finance 1005 David FIN
IT 1006 Alex ITS

명령어의 구성을 살펴보겠습니다:

  • -1 3은 첫 번째 파일 (employees.txt) 의 세 번째 필드를 결합 기준으로 사용하도록 지정합니다.
  • -2 1은 두 번째 파일 (departments.txt) 의 첫 번째 필드를 결합 기준으로 사용하도록 지정합니다.

이처럼 join을 사용하면 첫 번째 열뿐만 아니라 어떤 공통 필드라도 기준으로 삼아 파일을 병합할 수 있습니다. 서로 구조가 다른 파일들이 공통된 정보를 공유하고 있을 때 매우 유용하게 활용됩니다.

요약

이 실습에서는 Linux 의 join 명령어를 사용하여 여러 파일의 데이터를 병합하는 방법을 배웠습니다. 우리가 살펴본 주요 기능은 다음과 같습니다:

  • 공통 필드를 기반으로 한 두 파일의 기본적인 결합
  • -o 옵션을 사용한 출력 필드 순서 및 구성 사용자 정의
  • -a 옵션을 사용하여 일치하는 데이터가 없는 레코드 포함하기
  • -1-2 옵션을 사용하여 첫 번째 열이 아닌 다른 필드를 기준으로 결합하기

이 실습에서 다루지 않았지만 유용한 추가 옵션들은 다음과 같습니다:

  • -t CHAR: 입력 및 출력의 필드 구분자로 CHAR 문자를 사용합니다.
  • -i: 필드 비교 시 대소문자 차이를 무시합니다.
  • -e STRING: 누락된 입력 필드를 STRING 으로 대체합니다.
  • -j FIELD: -1 FIELD -2 FIELD와 동일한 역할을 합니다.
  • -v FILE_NUMBER: -a FILE_NUMBER와 비슷하지만, 결합된 행은 제외하고 짝이 없는 행만 출력합니다.

join 명령어는 Linux 환경에서 여러 소스의 정보를 효율적으로 통합할 수 있게 해주는 강력한 데이터 처리 도구입니다. 앞으로 Linux 에서 데이터를 다룰 때, 서로 다른 파일의 정보를 병합하고 분석하는 데 join 명령어를 적극 활용해 보시기 바랍니다.

참고 자료