![awk sub는 첫 번째 발생 대신 전역 교체를 수행합니다.](https://linux55.com/image/214986/awk%20sub%EB%8A%94%20%EC%B2%AB%20%EB%B2%88%EC%A7%B8%20%EB%B0%9C%EC%83%9D%20%EB%8C%80%EC%8B%A0%20%EC%A0%84%EC%97%AD%20%EA%B5%90%EC%B2%B4%EB%A5%BC%20%EC%88%98%ED%96%89%ED%95%A9%EB%8B%88%EB%8B%A4..png)
세미콜론으로 구분된 이 csv 파일이 있습니다. 8번째 필드의 첫 번째 항목인 1을 77로 바꾸고 싶습니다. 그러나 awk 명령은 필드 8의 모든 1을 77로 바꿉니다. 나는 무엇을 해야 합니까?
원본 CSV
1;abc;1;;;;;1;;1;;1;;;;;1;;;1;;
2;def;1;;;;;1;1;1;;;;;1;;;;1;;;
3;ghi;1;;;;1;1;1;1;;1;;1;1;;;;;1;;
4;jkl;1;;;;;1;;1;;1;1;;;1;;;;1;;
나는 이것을 시도했다
awk 'BEGIN{FS=OFS=";"} {sub(1, 77, $8)} {print}' ser.csv > tmp.csv
나는 이것을 기대하고 있었다
1;abc;1;;;;;77;;1;;1;;;;;1;;;1;;
2;def;1;;;;;1;1;1;;;;;1;;;;1;;;
3;ghi;1;;;;1;1;1;1;;1;;1;1;;;;;1;;
4;jkl;1;;;;;1;;1;;1;1;;;1;;;;1;;
그러나 나는 그것을 이해한다.
1;abc;1;;;;;77;;1;;1;;;;;1;;;1;;
2;def;1;;;;;77;1;1;;;;;1;;;;1;;;
3;ghi;1;;;;1;77;1;1;;1;;1;1;;;;;1;;
4;jkl;1;;;;;77;;1;;1;1;;;1;;;;1;;
답변1
"첫 번째 발생"이 "전체 입력에서 첫 번째 발생"을 의미한다고 가정하면 이는 아마도 awk(테스트되지 않음)에서 원하는 것일 것입니다.
awk 'BEGIN{FS=OFS=";"} !f && sub(1, 77, $8){f=1} {print}'
위의 내용은 1
모든 입력에서 처음 나타나는 필드 8을 대체합니다. 대신 모든 입력에서 처음으로 8번째 필드를 1의 값으로 바꾸려면 다음과 같습니다(또는 유사).
awk 'BEGIN{FS=OFS=";"} !f && ($8==1){$8=77; f=1} {print}'