하위 문자열을 특정 값으로 바꾸는 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()가 번호가 10비트 길이 필드 번호의 값인 필드를 찾도록 하기 때문입니다 var. 그래서 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자세히보다.

관련 정보