AWK는 ">"로 시작하지 않는 줄의 문자를 바꿉니다.

AWK는 ">"로 시작하지 않는 줄의 문자를 바꿉니다.

.나는 시퀀스 데이터로 작업하고 있지만 ""로 시작하지 않는 줄에서 ""를 ""로 바꾸기 위해 awk를 사용하는 올바른 방법을 어리석게도 찾을 수 없습니다 . sed 대신 awk를 사용해야 합니다.X>

지금까지 가지고 있지만 "."을 모두 대체한 것은 다음과 같습니다.

awk '/^>/ {next} {gsub(/\./,"X")}1' Sfr.pep > Sfr2.pep

하위 데이터 예:

>sequence.1
GTCAGTCAGTCA.GTCAGTCA

내가 얻고 싶은 결과 :

>sequence.1
GTCAGTCAGTCAXGTCAGTCA

답변1

이렇게 하는 것이 더 자연스러워 보입니다 sed.

sed '/^>/!y/./X/' Sfr.pep >Sfr2.pep

^>이는 현재 줄과 일치합니다("줄이 >문자로 시작합니까?"). 이 표현이 그렇다면아니요match, 이 y명령은 선의 각 점을 로 변경하는 데 사용됩니다 X.

시험:

$ cat Sfr.pep
>sequence.1
GTCAGTCAGTCA.GTCAGTCA
$ sed '/^>/!y/./X/' Sfr.pep >Sfr2.pep
$ cat Sfr2.pep
>sequence.1
GTCAGTCAGTCAXGTCAGTCA

코드의 주요 문제점 awknextfasta 헤더 라인을 만날 때마다 코드가 실행된다는 것입니다. 이는 코드가 헤더 없이 시퀀스 데이터만 생성한다는 의미입니다. 시퀀스 데이터는 괜찮을 것 같지만 별로 도움이 되지 않습니다.

단순히 테스트를 부정하고 next블록을 제거하면(또는 nextwith 이전에 print) 문제가 해결될 것입니다 awk. 그러나 이것은 내 개인적인 의견입니다. 단일 문자를 음역하기 위해 (또는 in)을 사용하는 것보다 in 명령을 사용하는 것이 y더 우아합니다 sed.gsub()s///gsed

답변2

당신은 시도 할 수 있습니다:

awk '!/^>/ { gsub(/\./, "X") }1' Sfr.pep > Sfr2.pep

산출:

>sequence.1
GTCAGTCAGTCAXGTCAGTCA

답변3

로 시작하는 줄은 인쇄하지 않고 >대체가 수행된 줄만 인쇄합니다. print다음 줄로 이동하기 전에 인쇄하려면 명령을 사용하십시오.

awk '/^>/ {print;next} {gsub(/\./,"X")}1' Sfr.pep > Sfr2.pep

답변4

#!/usr/bin/python
import re
g=re.compile(r'^>')
rep=re.compile(r'\.')
k=open('file','r')
for b in k:
    if not re.search(g,b):
        er=re.sub(rep,"X",b)
        print er.strip()
    else:
        print b.strip()

산출

>sequence.1
GTCAGTCAGTCAXGTCAGTCA

관련 정보