awk sub는 첫 번째 발생 대신 전역 교체를 수행합니다.

awk sub는 첫 번째 발생 대신 전역 교체를 수행합니다.

세미콜론으로 구분된 이 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}'

관련 정보