Linux 파일 조인

LinuxBeginner
지금 연습하기

소개

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

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

이것은 가이드 실험입니다. 학습과 실습을 돕기 위한 단계별 지침을 제공합니다.각 단계를 완료하고 실무 경험을 쌓기 위해 지침을 주의 깊게 따르세요. 과거 데이터에 따르면, 이것은 초급 레벨의 실험이며 완료율은 97%입니다.학습자들로부터 93%의 긍정적인 리뷰율을 받았습니다.

기본 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 텍스트 처리 명령어를 보완하여 명령줄에서 데이터 조작을 위한 강력한 도구 상자를 제공합니다.