사무실에서 MS 엑셀로 데이터 작업을 할 때, 상당히 자주 쓰게 되는 기능이 vlookup 기능입니다.
vslookup 기능에 대해서 간단하게 설명을 드리면, 두 개의 테이블을 만들고 하나의 테이블의 참조값을 이름으로 찾아서 두 번째 테이블에 자동으로 넣는 기능이라고 할 수 있겠네요.
예를 들면, 학생 명부 테이블과 우편번호 테이블이 있고, 학생명부에 주소를 입력하면 그 주소를 우편번호 테이블에서 찾아서 (lookup) 자동으로 학생명부에 우편번호가 들어가게 하는데 쓸 수 있는 함수입니다.
엑셀의 vlookup에 대해서는 여러 블로그에 상세하게 설명되어 있느니 관심있으신 분은 한번 찾아서 읽어보시면 좋을 것 같습니다.
엑셀에서는 vlookup으로 편하게 작업이 가능한데, 만일 리눅스 환경에서 텍스트 파일로 같은 비슷한 작업을 해야 한다면 어떤 방법이 있을까요?
- DB작업
데이터베이스를 만들어 해당 텍스트파일을 table로 import 하면 간단한 sql문으로 작업이 가능함.
하지만 DB가 있어야 하고, 간단한 텍스트 파일을 작업하기에는 번거로움 - Python 등 언어 이용
파이썬을 이용하면 강력한 텍스트 관련 기능으로 프로그래밍 가능함
1번보다는 쉽지만 여전히 조금 번거로운것은 어쩔수 없음 - awk이용
모든 유닉스 / 리눅스 배포판에 기본으로 들어가 있는 awk를 이용하면 제일 간단히 처리가 가능함
그래서 이번 포스트에서는 awk를 이용해서 간단히 데이터를 처리하는 방법을 알아보도록 하겠습니다.
코드를 먼저 적어보고, 설명해 보도록 하지요.
awk 'BEGIN {FS=OFS=";"} NR==FNR{postalcode[$1]=$2;next}{print $0, postalcode[$2]' postalcode.txt students.txt
$cat postalcode.txt
seoul;100
busan;200
daegu;300
$cat students.txt
Michael;seoul
Sam;daegu
Jane;busan
awk 자체가 one-liner 로 주로 쓰이는 언어라서 가독성은 좀 많이 떨어집니다. 하나하나 풀어보면,
- awk의 인자로 2개의 파일이 있습니다. (postalcode.txt, students.txt) 2개 이상의 파일을 인자로 awk를 실행시키면 awk는 첫 번째 파일을 먼저 처리하고, 두 번 째 파일을 처리함.
- FS=OFS=";" : 읽어들이는 텍스트 파일의 컬럼 구분자를 세미콜론으로 지정
- NR==FNR{postalcode[$1]=$2;next} : 첫 번째 파일을 읽어 들일 때만 실행함. postalcode라는 어레이를 생성하고, 해당 어레이의 값을 우편번호로 정의
- print $0, postalcode[$2] : $0 (전체 행) 을 출력하고, 마지막 필드에 해당하는 우편번호를 출력함
실행 결과는 아래 처럼 나오겠죠.
Michael;seoul;100
Sam;daegu;300
Jane;busan;200