#TIL #linux #awk csv 특정 컬럼 값을 0으로 바꾸기
$ 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
옵션을 추가하면 된다.
참고
- Getting Started (The GNU Awk User’s Guide) - gnu.org(archive)
- Why does “1” in awk print the current line? - Stack Overflow - stackoverflow.com(archive)
- linux - Save modifications in place with awk - Stack Overflow - stackoverflow…(archive)
- Replacing a column in CSV file with another in bash - Stack Overflow - stacko…(archive)