본문 바로가기

IT/리눅스 Linux

엑셀의 vlookup 기능을 리눅스에서? awk!

반응형

 

 

 

사무실에서 MS 엑셀로 데이터 작업을 할 때, 상당히 자주 쓰게 되는 기능이 vlookup 기능입니다.

vslookup 기능에 대해서 간단하게 설명을 드리면, 두 개의 테이블을 만들고 하나의 테이블의 참조값을 이름으로 찾아서 두 번째 테이블에 자동으로 넣는 기능이라고 할 수 있겠네요.

예를 들면, 학생 명부 테이블과 우편번호 테이블이 있고, 학생명부에 주소를 입력하면 그 주소를 우편번호 테이블에서 찾아서 (lookup) 자동으로 학생명부에 우편번호가 들어가게 하는데 쓸 수 있는 함수입니다.

엑셀의 vlookup에 대해서는 여러 블로그에 상세하게 설명되어 있느니 관심있으신 분은 한번 찾아서 읽어보시면 좋을 것 같습니다.

 

엑셀에서는 vlookup으로 편하게 작업이 가능한데, 만일 리눅스 환경에서 텍스트 파일로 같은 비슷한 작업을 해야 한다면 어떤 방법이 있을까요?

  1. DB작업
    데이터베이스를 만들어 해당 텍스트파일을 table로 import 하면 간단한 sql문으로 작업이 가능함.
    하지만 DB가 있어야 하고, 간단한 텍스트 파일을 작업하기에는 번거로움
  2. Python 등 언어 이용
    파이썬을 이용하면 강력한 텍스트 관련 기능으로 프로그래밍 가능함
    1번보다는 쉽지만 여전히 조금 번거로운것은 어쩔수 없음
  3. 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

 

 

반응형