하위 문자열을 특정 값으로 바꾸는 Awk 명령

하위 문자열을 특정 값으로 바꾸는 Awk 명령

필드에 314부터 323까지의 전화번호가 있는 플랫 파일이 있습니다. 이제 해당 필드를 1234567890.

이를 위해 아래 명령을 사용해 보았지만 둘 다 오류가 발생했습니다.

awk '{var=substr($0,314,10);gsub("[0-9]","1234567890",$var); print}' final_phone.txt >final_phone.txt1

fatal: Growth_fields_arr: fields_arr: 9849885432바이트의 메모리를 할당할 수 없습니다(메모리를 할당할 수 없음).

두 번째 경우

awk 'var=substr($0,314,10) { var = "1234567890" }1' final_phone.txt >final_phone.txt1

이것은 효과가 있었지만 값은 변경되지 않았습니다. 출력은 동일하게 유지되었습니다.

누군가 여기 구문을 도와줄 수 있나요?

첫 번째 경우에는 하위 문자열을 변수에 할당하려고 시도했으며 gsub()숫자 패턴을 확인하고 1234567890.

누군가 이것 좀 도와줄 수 있나요?

답변1

다음과 같이 두 개의 하위 문자열을 인쇄해야 합니다. 한 부분은 해당 위치 앞 부분이고 다른 부분은 해당 위치 뒤입니다.

$ awk -v dummy='0123456789' -v start=314 -v len=10 '
{ print substr($0, 1, start-1) dummy substr($0, start+len) }' infile >outfile

테스트:

$ awk -v dummy='0123456789' -v start=4 -v len=10 '
{ print substr($0, 1, start-1) dummy substr($0, start+len) }' <<<'0009876543210999'
0000123456789999

명령 문제:

  1. $vargsub()에 대한 세 번째 인수 대신 사용하고 있습니다. var결과적으로 gsub()는 숫자가 var10자리 길이 필드 번호인 필드를 찾기 때문에 awk는 해당 필드에서 gsub()를 시도합니다. #xxxxxxxxxx 그러나 매우 많은 수의 필드를 재평가하기 위한 메모리 할당으로 인해 실패합니다( $0gsub()의 세 번째 인수 이외의 필드를 사용할 때 awk가 기본 OFS에서 필드를 다시 다시 작성하도록 강제하기 때문입니다).

  2. 문제 #1을 해결하면 var변수의 모든 단일 숫자가 문자열로 대체됩니다 1234567890.

  3. 그런 다음 print업데이트를 수행하지 않기 때문에 변경 없이 현재 줄을 인쇄합니다.

답변2

sed대신에 awk덜 장황하게 사용할 수 있습니다 .

$ sed -E 's/^(.{313})[0-9]{10}/\10123456789/' infile
<313 chars>1234567890

답변3

awk 대신 Perl을 사용할 수 있습니다. 예를 들어

perl -p -e 'substr($_,313,10) = "1234567890"' final_phone.txt >final_phone.txt1

참고: Perl의 substr함수에서 오프셋은 1 대신 0부터 시작합니다. 따라서 오프셋 313은 314번째 문자입니다. 자세한 내용은 참조하세요 perldoc -f substr.

관련 정보