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