다음 샘플.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
위 명령은 X
That'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