나는 유전자에 따라 서열을 명명하고 저장하는 29개의 fasta 파일(확장자 .fa)을 가지고 있습니다.
(예: 리보솜 단백질 L1, 리보솜 단백질 L6P/L9E,...)
이 29개의 fasta 파일에는 총 722종이 있습니다. 각 서열의 첫 번째 줄에는 해당 유전자와 종 이름이 표시되고, 두 번째 줄에는 해당 서열이 표시됩니다.
1종은 1개 이상의 유전자 서열을 갖습니다.
유전자에 따라 정렬된 29개의 fasta 파일에서 722종을 별도의 722개 파일로 이동하고 싶습니다(유전자 대신 종에 따라 정렬).
상위 파일의 종 이름은 대괄호로 묶입니다 [ ]
.
for 루프를 사용하여 722개 파일을 추출하고 시퀀스 이름을 기반으로 파일 이름을 지정하는 방법은 무엇입니까?
다음의 예 Ribosomal Protein L1.fa
:
>gi|103486926|ref|YP_616487.1| 50S ribosomal protein L1 [Sphingopyxis alaskensis RB2256]
MAKLTKKQKALEGKVDAQKLHGVDEAIKLVRELATAKFDETLEIAMNLGVDPRHADQMVRGVVTLPAGTGKDVKVAVFAR
다음의 예 Ribosomal Protein L6PL9E.fa
:
>gi|410479108|ref|YP_006766745.1| ribosomal protein L6P/L9E [Leptospirillum ferriphilum ML-04]
MGFTHTVEFTLPSLIKASIEKQTIITLSSPDKELLGQFAADVRSIRPPEPYKGKGIKYSGEKILRKEGKTGKK
첫 번째 예를 들어,
종명: Sphingopyxis alaskensis RB2256
유전자 서열: MAKLTKKQKALEGKVDAQKLHGVDEAIKLVRELATAKFDETLEIAMNLGVDPRHADQMVRGVVTLPAGTGKDVKVAVFA
파일 이름을 지정 Sphingopyxis alaskensis RB2256.fa
하고 해당 종 이름을 가진 모든 시퀀스를 파일에 삽입하고 싶습니다.
이 작업을 수행하기 위해 bash 쉘을 사용하고 있습니다. grep
작업을 완료하는 데 사용할 수 있습니다 .
grep -A+1 "Sphingopyxis alaskensis RB2256" *.fa >> Sphingopyxis alaskensis RB2256.fa
그런데 종별로 순서를 정렬하려면 722번을 해야 합니다.
for 루프의 grep을 사용하여 작업을 단순화할 수 있습니까? 아니면 다른 방법이 있나요?
답변1
Fasta 형식에서는 모든 시퀀스가 한 줄에 있을 필요가 없습니다. 사실, 대부분의 생물학적 서열이 매우 길기 때문에 이는 흔하지 않습니다. 따라서 grep
ID 시퀀스가 한 행을 초과하면 어떤 경우에도 실패하게 됩니다. 또한 명령은 이라는 파일 대신 이라는 grep
파일을 생성합니다 .Sphingopyxis
Sphingopyxis alaskensis RB2256.fa
어쨌든, 각 시퀀스를 종 뒤에 파일 이름으로 넣어서 다음과 같이 할 수 있습니다.
awk -F'[][]' '/>/{n=$2}; {print >> n".fa"}' *.fa
그러나 파일 이름에 공백을 사용하지 않는 것이 좋습니다. 공백을 사용하면 작업이 더 어려워질 뿐입니다. 더 안전한 접근 방식은 다음과 같습니다.
awk -F'[][]' '/>/{n=$2; gsub(/ /,"_",n)}; {print >> n".fa"}' *.fa
gsub
종 이름의 모든 공백을 바꾸면 _
다음 파일이 생성됩니다.
Leptospirillum_ferriphilum_ML-04.fa Sphingopyxis_alaskensis_RB2256.fa
위의 두 가지 방법 모두 여러 줄의 시퀀스를 처리할 수 있습니다.