우리는 Redhat Linux 7.9 및 bsh
.
데이터 파일을 살펴보고 모든 필드를 열 10과 열 20 사이의 공백을 0으로 바꾸고 싶습니다.
따라서 샘플 파일이 있는 경우:
#######################
#######################
#######################
######### ######
#######################
#######################
#######################
#######################
나는 스크립트가 다음과 같기를 원합니다:
#######################
#######################
#######################
#########000000000#####
#######################
#######################
#######################
#######################
나는 다음을 사용해 보았습니다.
awk '{val=substr($0,10,9);gsub(val," ","000000000")}1' scr1
하지만 원본 파일만 반환됩니다. 내가 놓친 게 무엇입니까?
답변1
Perl은 표시된 것처럼 이를 간단하게 처리할 수 있습니다.
Perl 인덱스는 0에서 시작하므로 열 10은 9이고 col10...20에는 20-10+1=11 요소가 있습니다.
$ perl -lpe 'substr($_, 9, 11) =~ tr/ /0/' file
산출:-
#######################
#######################
#######################
12345678901234567890
#########00000000000###
12345678901
#######################
#######################
답변2
매개변수 의 gsub()
순서와 의미가 잘못되었습니다. 매뉴얼 페이지를 참조하세요.
모든 Unix 시스템의 모든 쉘에서 awk를 사용하여 다음과 같은 작업을 수행하려는 것처럼 보입니다.
$ awk '{val=substr($0,10,9)} gsub(/ /,0,val){$0=substr($0,1,9) val substr($0,19)} 1' file
#######################
#######################
#######################
#########00000000######
#######################
#######################
#######################
#######################