소개
이 실습에서는 Linux 의 join 명령어를 사용하여 여러 파일의 데이터를 병합하는 방법을 배웁니다. 회사의 인사부에서 근무하며 서로 다른 데이터베이스에 흩어져 있는 직원 정보를 통합해야 하는 상황을 가정해 보겠습니다. 이 실무 연습을 통해 데이터 처리 작업에서 join 명령어가 가진 강력함과 유연성을 직접 확인하실 수 있습니다.
이 실습에서는 Linux 의 join 명령어를 사용하여 여러 파일의 데이터를 병합하는 방법을 배웁니다. 회사의 인사부에서 근무하며 서로 다른 데이터베이스에 흩어져 있는 직원 정보를 통합해야 하는 상황을 가정해 보겠습니다. 이 실무 연습을 통해 데이터 처리 작업에서 join 명령어가 가진 강력함과 유연성을 직접 확인하실 수 있습니다.
먼저 직원 데이터 파일의 내용을 살펴보겠습니다. 우리에게는 employees.txt와 salaries.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
내부적으로 어떤 작업이 일어났는지 분석해 보겠습니다:
join 명령어는 두 파일의 첫 번째 필드 (직원 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 명령어를 적극 활용해 보시기 바랍니다.