.
나는 시퀀스 데이터로 작업하고 있지만 ""로 시작하지 않는 줄에서 ""를 ""로 바꾸기 위해 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
코드의 주요 문제점 awk
은 next
fasta 헤더 라인을 만날 때마다 코드가 실행된다는 것입니다. 이는 코드가 헤더 없이 시퀀스 데이터만 생성한다는 의미입니다. 시퀀스 데이터는 괜찮을 것 같지만 별로 도움이 되지 않습니다.
단순히 테스트를 부정하고 next
블록을 제거하면(또는 next
with 이전에 print
) 문제가 해결될 것입니다 awk
. 그러나 이것은 내 개인적인 의견입니다. 단일 문자를 음역하기 위해 (또는 in)을 사용하는 것보다 in 명령을 사용하는 것이 y
더 우아합니다 sed
.gsub()
s///g
sed
답변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