Linux 파일 조인

LinuxBeginner
지금 연습하기

소개

이 랩에서는 공통 필드를 기반으로 두 파일의 데이터를 결합할 수 있는 강력한 유틸리티인 Linux 의 join 명령어를 소개합니다. 데이터베이스에서 테이블을 조인하는 것과 유사하게, 이 명령어는 Linux 환경에서 데이터 처리 및 분석 작업에 특히 유용합니다.

이 랩을 통해 join 명령어를 다양한 옵션과 함께 사용하여 별도의 파일에서 데이터를 병합하고, 서로 다른 필드 구분자를 처리하며, Linux 에서 파일 조인 작업의 기본 원리를 이해하는 방법을 배우게 됩니다. 이러한 기술은 시스템 관리 및 데이터 분석에서 흔히 사용되는 작업인 텍스트 파일의 구조화된 데이터를 다룰 때 유용할 것입니다.

기본 Join 명령어 이해

이 단계에서는 join 명령의 기본 구문과 사용법을 배우게 됩니다. Linux 의 join 명령어는 데이터베이스에서 테이블을 조인하는 것과 유사하게, 공통 필드를 기반으로 두 파일의 행을 결합합니다.

작업할 샘플 파일 두 개를 만들어 보겠습니다. 날씨 데이터, 특히 폭풍 이벤트의 날짜와 해당 풍향을 포함하는 파일을 만들 것입니다.

먼저, 폭풍 ID 와 날짜가 포함된 storms.txt 파일을 만듭니다.

echo -e "1:2023-04-01\n2:2023-04-15\n3:2023-05-02" > ~/project/storms.txt

이제 폭풍 ID 와 풍향이 포함된 winds.txt 파일을 만듭니다.

echo -e "1:NW\n2:SE\n3:NE" > ~/project/winds.txt

이 파일들의 구조를 이해하기 위해 내용을 살펴보겠습니다.

cat ~/project/storms.txt

다음과 같은 출력을 볼 수 있습니다.

1:2023-04-01
2:2023-04-15
3:2023-05-02

이제 winds 파일을 살펴보겠습니다.

cat ~/project/winds.txt

다음과 같은 출력을 볼 수 있습니다.

1:NW
2:SE
3:NE

두 파일 모두 조인에 사용할 수 있는 공통 첫 번째 필드 (폭풍 ID) 가 있음을 알 수 있습니다. 이제 join 명령어를 사용하여 이 공통 필드를 기반으로 이 파일들을 결합해 보겠습니다.

join -t: ~/project/storms.txt ~/project/winds.txt

-t: 옵션은 join 명령어에게 두 파일의 필드 구분자가 콜론 (:) 임을 알려줍니다. 기본적으로 join은 각 파일의 첫 번째 열에서 공통 필드를 찾습니다.

다음과 같은 출력을 볼 수 있습니다.

1:2023-04-01:NW
2:2023-04-15:SE
3:2023-05-02:NE

이 출력은 두 파일에서 조인된 데이터를 보여줍니다. 각 행에는 다음이 포함됩니다.

  • 폭풍 ID (공통 필드)
  • 날짜 (첫 번째 파일에서)
  • 풍향 (두 번째 파일에서)

join 명령어는 동일한 폭풍 ID 를 가진 행을 일치시키고 이를 출력에서 단일 행으로 결합했습니다.

다른 필드 구분자를 사용하여 파일 조인

실제 시나리오에서는 서로 다른 문자를 필드 구분자로 사용하는 파일을 자주 접하게 됩니다. 이 단계에서는 추가 텍스트 처리를 사용하여 join 명령어로 이러한 파일을 조인하는 방법을 보여줍니다.

서로 다른 필드 구분자를 가진 파일 두 개를 만들어 보겠습니다.

먼저, 대시 (-) 를 구분자로 사용하여 폭풍 ID 와 날짜가 포함된 storms_dash.txt 파일을 만듭니다.

echo -e "1-2023-04-10\n2-2023-04-20\n3-2023-05-05" > ~/project/storms_dash.txt

다음으로, 쉼표 (,) 를 구분자로 사용하여 폭풍 ID 와 풍향이 포함된 winds_comma.txt 파일을 만듭니다.

echo -e "1,NW\n2,SE\n3,NE" > ~/project/winds_comma.txt

이 파일들의 내용을 살펴보겠습니다.

cat ~/project/storms_dash.txt

다음과 같은 출력을 볼 수 있습니다.

1-2023-04-10
2-2023-04-20
3-2023-05-05

이제 winds_comma 파일을 살펴보겠습니다.

cat ~/project/winds_comma.txt

다음과 같은 출력을 볼 수 있습니다.

1,NW
2,SE
3,NE

여기서 문제는 join 명령어가 두 파일 모두 동일한 필드 구분자를 사용할 것으로 예상한다는 것입니다. 이 문제를 해결하려면 다른 파일의 구분자와 일치하도록 파일 중 하나를 전처리해야 합니다. tr 명령어를 사용하여 문자를 변환할 수 있습니다.

join -t- ~/project/storms_dash.txt <(tr ',' '-' < ~/project/winds_comma.txt)

이 명령어는 다음 작업을 수행합니다.

  1. tr ',' '-' < ~/project/winds_comma.txt - winds_comma.txt의 내용에서 모든 쉼표를 대시로 변환합니다.
  2. <(...) - 프로세스 치환 (Process substitution) 으로, 괄호 안의 명령의 출력을 파일로 처리합니다.
  3. join -t- ~/project/storms_dash.txt - storms_dash.txt 파일을 변환된 데이터와 조인하며, 대시 (-) 를 필드 구분자로 사용합니다.

다음과 같은 출력을 볼 수 있습니다.

1-2023-04-10-NW
2-2023-04-20-SE
3-2023-05-05-NE

이 출력은 두 파일에서 조인된 데이터를 보여주며, 전체적으로 대시 (-) 를 필드 구분자로 사용합니다. 프로세스 치환은 임시 파일을 만들 필요 없이 명령의 출력을 파일로 처리할 수 있게 해주는 bash 의 강력한 기능입니다.

고급 Join 옵션

실제 데이터 처리 작업에서는 쌍을 이루지 않는 데이터를 처리하거나 특정 필드를 선택하는 등 더 고급 조인 작업이 필요한 경우가 많습니다. 이 단계에서는 join 명령의 이러한 고급 옵션을 소개합니다.

예제를 위해 더 복잡한 파일 두 개를 만들어 보겠습니다.

echo -e "1:2023-04-01:Thunderstorm\n2:2023-04-15:Hurricane\n3:2023-05-02:Tornado\n4:2023-05-10:Blizzard" > ~/project/storms_types.txt
echo -e "1:High\n2:Medium\n5:Low" > ~/project/severity.txt

이 파일들의 내용을 살펴보겠습니다.

cat ~/project/storms_types.txt

다음과 같은 출력을 볼 수 있습니다.

1:2023-04-01:Thunderstorm
2:2023-04-15:Hurricane
3:2023-05-02:Tornado
4:2023-05-10:Blizzard
cat ~/project/severity.txt

다음과 같은 출력을 볼 수 있습니다.

1:High
2:Medium
5:Low

이 파일들은 ID 가 완벽하게 일치하지 않는다는 것을 알 수 있습니다.

  • severity.txt에는 storms_types.txt에 존재하지 않는 폭풍 ID 5 에 대한 항목이 있습니다.
  • storms_types.txt에는 severity.txt에 존재하지 않는 폭풍 ID 3 과 4 에 대한 항목이 있습니다.

기본적으로 join은 조인 필드가 두 파일 모두에서 일치하는 행만 출력합니다.

join -t: ~/project/storms_types.txt ~/project/severity.txt

다음과 같은 출력을 볼 수 있습니다.

1:2023-04-01:Thunderstorm:High
2:2023-04-15:Hurricane:Medium

폭풍 ID 1 과 2 만 출력에 나타납니다. 이는 두 파일 모두에 존재하는 유일한 ID 이기 때문입니다.

쌍을 이루지 않는 행 처리하기

출력에 쌍을 이루지 않는 행을 포함하려면 -a 옵션을 사용할 수 있습니다.

join -t: -a 1 -a 2 ~/project/storms_types.txt ~/project/severity.txt

-a 1 옵션은 join에게 첫 번째 파일에서 쌍을 이루지 않는 행을 포함하도록 지시하고, -a 2는 두 번째 파일에 대해 동일한 작업을 수행합니다.

다음과 같은 출력을 볼 수 있습니다.

1:2023-04-01:Thunderstorm:High
2:2023-04-15:Hurricane:Medium
3:2023-05-02:Tornado:
4:2023-05-10:Blizzard:
5::Low

쌍을 이루지 않는 행에는 다른 파일의 데이터가 있을 위치에 빈 필드가 있음을 알 수 있습니다.

특정 필드 선택하기

-o 옵션을 사용하여 각 파일에서 출력에 포함할 특정 필드를 선택할 수도 있습니다.

join -t: -o 1.1,1.3,2.2 ~/project/storms_types.txt ~/project/severity.txt

-o 1.1,1.3,2.2 옵션은 출력할 필드를 지정합니다.

  • 1.1: 첫 번째 파일의 첫 번째 필드 (폭풍 ID)
  • 1.3: 첫 번째 파일의 세 번째 필드 (폭풍 유형)
  • 2.2: 두 번째 파일의 두 번째 필드 (심각도)

다음과 같은 출력을 볼 수 있습니다.

1:Thunderstorm:High
2:Hurricane:Medium

이 출력에는 폭풍 ID, 폭풍 유형 및 심각도 수준만 포함되며 날짜 정보는 생략됩니다. 이는 많은 필드가 있지만 출력에 특정 필드만 필요한 파일로 작업할 때 특히 유용합니다.

요약

이 Lab 에서는 Linux 에서 join 명령어를 사용하여 공통 필드를 기반으로 서로 다른 파일의 데이터를 결합하는 방법을 배웠습니다. 이는 Linux 환경에서 데이터 처리 및 분석에 필수적인 기술입니다.

다양한 옵션을 사용하여 join 명령어를 연습했습니다.

  • 동일한 필드 구분자를 가진 파일을 조인하기 위한 기본 구문
  • 프로세스 치환 (process substitution) 및 tr 명령어를 사용하여 서로 다른 필드 구분자를 가진 파일 처리
  • -a 옵션을 사용하여 출력에 쌍을 이루지 않는 행 포함
  • -o 옵션을 사용하여 출력에 각 파일에서 특정 필드 선택

join 명령어는 구조화된 텍스트 데이터, 로그 파일 또는 공통 식별자를 기반으로 서로 다른 소스의 정보를 결합해야 하는 모든 상황에서 특히 유용합니다. 이 기술은 grep, sed, awk와 같은 다른 Linux 텍스트 처리 명령어를 보완하여 명령줄에서 데이터 조작을 위한 강력한 도구 상자를 제공합니다.