1 minute read

$ cat sample.csv
1,2,3,4,5
a,b,c,d,e
A,B,C,D,E

이런 파일이 있다. 두 번째 컬럼 값만 0으로 바꾸고 싶다면 어떻게 해야 할까?

$ awk 'BEGIN{FS=OFS=","} {$2=0}'1 sample.csv
1,0,3,4,5
a,0,c,d,e
A,0,C,D,E

awk 짱이시다. 쓸데마다 찾아본다. 복잡한 인자. 아직 친해지려면 멀었다. 우선 awk에서 쓰는 용어 정리부터 하자. 룰(rule), 패턴(pattern), 액션(action)이란 용어를 사용한다. 룰은 pattern { action } 문법으로 구성한다.

BEGIN 패턴은 입력 처리 전에 한 번 호출한다. 처리 후에 부르는 END 패턴도 있다.

BEGIN 패턴으로 정의한 FS=OFS=“,” 액션은 입력 필드 분리 기호(separator)와 출력 필드 분리 기호를 설정한다. 둘 다 , 문자를 사용했다.

$ awk 'BEGIN{FS=",";OFS="|"} {$2=0}'1 sample.csv
1|0|3|4|5
a|0|c|d|e
A|0|C|D|E

만약 출력 필드 분리 기호를 | 문자로 한다면 출력할 때, | 문자를 사용해서 필드를 합친다.

패턴 없이 액션만 있는 {$2=0} 룰은 모든 입력을 처리한다. $2=0 액션으로 2번째 필드를 0으로 바꾼다.

그럼 끝에 붙은 1은 뭘까? 현재 라인을 출력하는 액션이다. ’ 문자 왼쪽에 써도 되고 오른쪽에 써도 된다.

$ awk 'BEGIN{FS=OFS=","} {$2=0} {print}' sample.csv

대신에 {print} 액션을 써도 된다.

$ gawk -i inplace 'BEGIN{FS=OFS=","} {$2=0}'1 sample.csv
$ cat sample.csv
1,0,3,4,5
a,0,c,d,e
A,0,C,D,E

파일을 바로 수정하려면 gawk 프로그램을 대신 사용하고 -i inplace 옵션을 추가하면 된다.

참고