필드에 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
명령 문제:
$var
gsub()에 대한 세 번째 인수 대신 사용하고 있습니다.var
결과적으로 gsub()는 숫자가var
10자리 길이 필드 번호인 필드를 찾기 때문에 awk는 해당 필드에서 gsub()를 시도합니다. #xxxxxxxxxx 그러나 매우 많은 수의 필드를 재평가하기 위한 메모리 할당으로 인해 실패합니다($0
gsub()의 세 번째 인수 이외의 필드를 사용할 때 awk가 기본 OFS에서 필드를 다시 다시 작성하도록 강제하기 때문입니다).문제 #1을 해결하면
var
변수의 모든 단일 숫자가 문자열로 대체됩니다1234567890
.그런 다음
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
.