두개의 텍스트 파일을 조건에 따라 합치기 (awk로 두개의 파일열기, getline)

Unix나 Linux에서 엔지니어로 일을 하다 보면 쉘스크립트(Shell script)를 작성해야 하는 경우가 많다. 더군다나 수 십대 이상의 Unix 및 Linux 서버를 대상으로 동일한 성격의 작업을 반복하다 보면…

“이게 웬 막노동(일명:노가다) 인가..”

라는 생각이 치밀곤 한다.

그 중의  하나가 두 개의 텍스트 파일을 비교하고 한 파일의 일부를 다른 파일에 합치는 그런 프로그램이 있었으면 하는 경우가 종종 있다.

그냥 단순한 파일합치기 혹은 파일을 비교해 다른 줄을 출력하는 정도라면 운영체제에서 제공되는 명령을 써서 쉽게 원하는 결과물을 얻을 수 있겠지만 여러 조건이 겹치거나 구분자로 구분되는 특정 컬럼의 값만을 가져오고 싶은 경우라면 단순 명령어 만으로는 원하는 결과를 얻기가 힘들다.

그렇다고 C로 프로그램을 코딩하자니 시간이 문제고….

그럴 때 유용하게 사용할 수 있는 스크립트 언어가 바로 Perl이다. 하지만 Perl은 시스템엔지니어들에게는 특히나 우리나라의 단순 무식(?)한 엔지니어들이 사용하기에는 너무 개발자틱한 언어다. 사실 나도 펄을 손에서 놓은 지가 무척 오래돼서 잘 기억도 안난다. ㅋㅋㅋ그래서 요즘엔 awk를 즐겨 사용한다.

awk 명령을 사용하여 두 파일의 내용을 병합하기

awk는 그냥 명령어가 아닌 내부 스크립트를 제공하여 여러 문자열 처리함수는 물론 다수의 파일을 열고 내용을 가져와 처리할 수 있는 강력한 기능을 제공하는 문자열 처리 명령어다.

오늘은 awk를 이용하여 몇 일전에 작성한 두 파일을 비교하고 일부 내용을 하나의 파일에 합병하는 스크립트를 작성하여 40여대의 서버에 동일한 작업을 Copy/Paste하여 짧은시간에 완료하였다.

그 예제를 간단히 설명하는 것으로 몇몇 부지런한 웹 서퍼들에게 도움을 줄 수 있었으면 좋겠다.

file1.txt

———-

김태호|인천|011-X82-794X|남자

강세미|인천|019-X85-675X|여자

김민영|인천|없음|여자

file2.txt

———-

김태호|인천|19711114|18

강세미|인천|19720119|27

위와 같은 두 개의 파일이 있다고 가정하고 병합 조건을 살펴보면

1. file1을 기준으로 하며 두 파일의 첫번째와 두번째 컬럼을 Key로 한다.

2. file1에 있고 file2에 없을 경우 파일1의 내용을 그대로 기록한다.

3. file2에 있고 file1에 없을 경우 버린다.

이런 조건일 경우 다음과 같은 awk 스크립트를 사용하면 합병할 수 있다.자세한 스크립트의 설명은 생략한다.

소스코드

cat file1.txt | awk -F"|" '{
Success = 0

while (getline strLine < “file2.txt")
{
             split (strLine, Comment, "|")

             if (Comment[1] == 1 && Comment[2] == $2 && Success == 0){
                           print $1"|"$2"|"$3"|"$4"|"Comment[3]"|"Comment[4];
                           Success = 1;
             }           
}
close("file2.txt");

if (Success == 0) {
             print $1"|"$2"|"$3"|"$4"||”;
}
}'

p.s 위 예제는 쉽게 예를 들기 위해 간단하게 수정한 것으로 테스트를 거치지 않았음.

#awk #문자열처리 #쉘스크립트

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

Scroll to Top