join 명령어
csv 파일을 join할 때 사용하기 좋다
예제 시나리오 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번 파일에만 있는 데이터도 출력한다.