특정 행과 열의 문자 바꾸기

특정 행과 열의 문자 바꾸기

다음 샘플.txt를 고려하세요.

ATO   N   X B               
AT    H1  X BT              
ATOM H25  X BAA              
ATOM  H3  X BUTZ              
ATOM  CA  X BAT 

2-4행의 X를 awk 등의 "A"로 바꾸고 싶으므로 출력은 다음과 같아야 합니다.

ATO   N   X B               
AT    H1  A BT              
ATOM H25  A BAA              
ATOM  H3  A BUTZ              
ATOM  CA  X BAT 

파일에서 해당 위치를 강조합니다.

어떻게 해야 하나요? 감사해요

답변1

그리고 awk:

awk 'BEGIN{ OFS=FS="" } FNR>=2 && FNR<=4 && $11=="X"{ $11="A" }1' sample.txt

빈 문자열을 입력 및 출력 필드 구분자로 사용하고, 11번째 필드가 포함된 경우 입력 파일의 정의 레코드 번호로 바꿉니다 X. 그런 다음 기록을 인쇄하십시오.

답변2

간단한 sed명령으로 작업을 수행합니다.

sed '2,4s/ X / A /' your_file


cat foo.txt
ATO   N   X B               
AT    H1  X BT              
ATOM H25  X BAA              
ATOM  H3  X BUTZ              
ATOM  CA  X BAT 

sed '2,4s/ X / A /' foo.txt

ATO   N   X B               
AT    H1  A BT              
ATOM H25  A BAA              
ATOM  H3  A BUTZ              
ATOM  CA  X BAT 

@Quasimodo가 지적했듯이 sed위 명령은 XThat's a GNU Awk 솔루션과 같은 다른 시퀀스가 ​​발생하면 실패합니다.

awk 'NR >= 2 && NR <= 4 && $3~/X/ { sub(/X/, "A") } { print }' foo.txt

고쳐 쓰다

이 명령을 제공한 @Quasimodo에게 큰 감사를 드립니다.

sed '2,4s/^\(.\{10\}\)X/\1A/'

이렇게 하면 11번째 문자에서 X만 교체됩니다.

답변3

사용, 그림에 표시된 것처럼 반드시 GNU일 필요는 없습니다. 먼저 범위를 기준으로 행을 선택한 다음 11번째 문자 위치에서 바꿔서 더욱 구체화합니다.

awk '(NR==2),(NR==4) {
    sub(/^.{10}X/, substr($0,1,10) "A")
}1' file

같은 것진주

perl -lpe 'substr($_,10,1) =~ s/X/A/ if 2..4' file

sed -e '
  2,4s/./&\n/11
  s/X\n/A/;s/\n//
' file

입력하다:

cat - <<\! > file
ATO   N   X B               
AT    H1  Q BT              
ATOM H25  X BA
ATOM  H3  X
ATOM  CA  X BAT 
!

결과:

ATO   N   X B               
AT    H1  Q BT              
ATOM H25  A BA
ATOM  H3  A
ATOM  CA  X BAT 

답변4

awk 'NR >1 && NR <5 {gsub("X","A",$3)}1' filename

산출

ATO   N   X B               
AT    H1  A BT              
ATOM H25  A BAA              
ATOM  H3  A BUTZ              
ATOM  CA  X BAT

관련 정보