[bash: awk] 2개의 파일에 있는 자료 종합하기 리눅스 bash script

제목이 약간 애매하긴 한데, 같은 항목에 대한 서로 다른 정보를 지닌 2개의 파일을 종합하여 하나의 파일로 만드는 문제를 awk를 이용하여 해결하는 방법이다. 일단 예시를 하나 생각해 보자.

data1.txt, data2.txt 이렇게 2개의 파일이 있다고 가정하자. 먼저 data1.txt 파일에는 사원번호, 이름, 사무실번호가 저장되어 있다.
 
# data1.txt 내용 확인
cat data1.txt
id_number name office
2341 john 101
3354 jane 102
3559 harry 201

두번째로 data2.txt 파일에는 사원번호와 전화번호가 저장되어 있다.

# data2.txt 내용 확인
cat data2.txt
id_number phone
2341 111-2222
3354 222-3333
3559 333-4444

위의 2개 파일을 하나로 합쳐서 사원번호, 이름, 사무실번호, 전화번호로 된 파일을 새로 만들고 싶은 경우다.

방법은 대략 이렇다. awk에서 2개 파일을 순차적으로 읽도록 인자로 주는데, 입력 데이터의 행번호(NR)와 파일의 행번호(FNR)가 같으면 첫번째 파일에 속한 것이고, 다르면 두번째 파일에 속한 것이다.

첫번째 파일을 읽으면서 NR의 값이 1에서 4까지 증가, FNR의 값도 1에서 4까지 증가한다. 두번째 파일을 읽으면서 NR의 값은 5에서 8까지 증가, FNR의 값은 (파일이 바뀌었으므로) 1부터 4까지 증가한다.

차근차근 예시를 보면서 생각해 보자.

먼저 2개의 파일을 읽어서 첫번째 파일에 속한 내용만 출력해 보자.

# 첫번째 파일의 내용만 출력
awk 'NR==FNR { print }' data1.txt data2.txt

위와 같이 입력하면, 먼저 data1.txt의 내용이 입력되고 이어서 data2.txt의 내용이 입력된다. 입력 데이터의 행번호와 파일의 행번호가 같을 때(NR==FNR)만 print 명령으로 출력하므로 data1.txt의 내용만 출력된다.

이번에는 두번째 파일에 속한 내용만 출력해 보자. 이 경우에는 입력 데이터의 행번호와 파일의 행번호가 다를 때만 print 명령을 실행해야 한다. 두 행번호가 같을 때는 이후 명령을 무시하고 다음 행으로 넘어가기 위해 next 명령을 사용하면 된다.

# 두번째 파일의 내용만 출력
awk 'NR==FNR { next }; { print }' data1.txt data2.txt

자, 이제 두개의 파일을 합쳐 보자. 첫번째 파일의 내용을 읽어서 필요한 부분을 배열(array)에 저장한 후, 두번째 파일의 내용을 읽어서 출력할 때 배열에 저장했던 값을 같이 출력하도록 한다. data2.txt 파일을 먼저 읽어서 전화번호만 저장했다가 data1.txt 파일을 출력할 때 같이 합쳐주자. data2.txt 파일을 먼저 읽기 위해 아래의 예시처럼 인자의 순서를 바꿔야 함에 유의.

# data2.txt의 두번째 항목($2)을 data1.txt와 함께 출력. data2.txt를 먼저 읽기 위해 첫번째 인자 자리에 위치시킴
awk 'NR==FNR { temp[FNR]=$2; next }; { print $0 " " temp[FNR] }' data2.txt data1.txt
id_number name office phone
2341 john 101 111-2222
3354 jane 102 222-3333
3559 harry 201 333-4444

위의 작업에 대해 조금 더 설명하자면, data2.txt 파일을 읽어서 두번째 항목($2)을 temp라는 배열에 저장해 두었다가 data1.txt 파일을 읽을 때 읽은 내용과 함께 temp에 저장된 값을 같이 출력해 주었다.

별도의 파일로 저장하는 것은 리다이렉션으로 간단히 가능.

awk 'NR==FNR { temp[FNR]=$2; next }; { print $0 " " temp[FNR] }' data2.txt data1.txt > data_merged.txt

위와 같은 작업을 하려면 당연히 두개 파일에 들어가 있는 자료의 순서가 서로 같아야 한다. 만약 순서가 다르다면 sort 등을 활용해서 같은 순서로 정렬하는 작업이 필요하다.

전체적으로 작업이 조금 복잡하긴 한데, 대량의 자료에 대해 이런 종류의 작업을 해야 할 경우 아주 요긴하다.

awk 활용에 대한 다른 게시물들은 여기로



덧글

댓글 입력 영역
* 비로그인 덧글의 IP 전체보기를 설정한 이글루입니다.

Google Analytics


B-Side


adsense(w160_h600)2

통계 위젯 (화이트)

7581061
5759
1288631

ad_widget_2