예제 시나리오 1

다음과 같이 두 개의 csv 파일이 있다고 하자.

  • age.csv 파일
철수,20세
영희,21세
민수,19세
민지,22세
  • hobby.csv 파일
철수,배드민턴
영희,축구
민수,달리기
민지,수영

단순 join

단순하게 join 해주면 두 파일을 하나로 합쳐서 볼 수 있다.

$ join -t , age.csv hobby.csv
철수,20세,배드민턴
영희,21세,축구
민수,19세,달리기
민지,22세,수영
  • -t , : 구분자로 콤마를 사용한다.

출력 필드 지정

-o 옵션을 사용하여 출력할 필드를 선택하고 순서를 지정할 수 있다.

$ join -o 1.2,2.2,1.1 -t , age.csv hobby.csv
20세,배드민턴,철수
21세,축구,영희
19세,달리기,민수
22세,수영,민지
  • -o 1.2,2.2,1.1 : 1번 파일의 2번 필드(나이), 2번 파일의 2번 필드(취미), 1번 파일의 1번 필드(이름)를 출력한다.

예제 시나리오 2

다음과 같이 두 개의 csv 파일이 있다고 하자.

  • age.csv 파일
영희,21세
철수,20세
민수,19세
수진,23세
민지,22세
  • hobby.csv 파일
철수,배드민턴
영희,축구
민수,달리기

join 기준이 되는 컬럼은 정렬하도록 한다

두 파일의 join 기준 컬럼이 정렬되어 있지 않아 기대한 것보다 더 적은 row가 출력될 수 있다.

$ join -t , age.csv hobby.csv
철수,20세,배드민턴

따라서 [[/cmd/sort]]로 정렬한 파일을 사용하는 것을 생각할 수 있다.

$ sort -t , -k1,1 age.csv > age-sorted.csv

$ sort -t , -k1,1 hobby.csv > hobby-sorted.csv

$ cat age-sorted.csv
민수,19세
민지,22세
수진,23세
영희,21세
철수,20세

$ cat hobby-sorted.csv
민수,달리기
영희,축구
철수,배드민턴

이제 join을 실행하면 정상적으로 join 된 결과가 출력된다.

$ join -t , age-sorted.csv hobby-sorted.csv
민수,19세,달리기
영희,21세,축구
철수,20세,배드민턴

join 되지 않은 데이터도 출력하기

만약 한쪽 파일에만 있는 데이터도 출력하고 싶다면 -a 옵션을 사용한다.

$ join -a1 -t , age-sorted.csv hobby-sorted.csv
민수,19세,달리기
민지,22세
수진,23세
영희,21세,축구
철수,20세,배드민턴
  • -a1 : 1번 파일에만 있는 데이터도 출력한다.

join 되지 않은 데이터에 문구 지정하기

-e 옵션을 사용하여 join 되지 않은 데이터에 출력할 문구를 지정할 수 있다. 단, -a 옵션과 -o 옵션을 사용해야 작동한다.

$ join -e NULL -a1 -o 1.1,1.2,2.1,2.2 -t , age-sorted.csv hobby-sorted.csv
민수,19세,민수,달리기
민지,22세,NULL,NULL
수진,23세,NULL,NULL
영희,21세,영희,축구
철수,20세,철수,배드민턴
  • -e NULL : join 되지 않은 데이터에 NULL을 지정해 출력한다.
  • -o 1.1,1.2,2.1,2.2 : 1번 파일의 1번 필드(이름), 1번 파일의 2번 필드(나이), 2번 파일의 1번 필드(이름), 2번 파일의 2번 필드(취미)를 출력한다.
  • -a1 : 1번 파일에만 있는 데이터도 출력한다.