for 루프는 단일 명령으로 상위 파일의 여러 텍스트를 여러 파일로 가져옵니다.

for 루프는 단일 명령으로 상위 파일의 여러 텍스트를 여러 파일로 가져옵니다.

나는 유전자에 따라 서열을 명명하고 저장하는 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 형식에서는 모든 시퀀스가 ​​한 줄에 있을 필요가 없습니다. 사실, 대부분의 생물학적 서열이 매우 길기 때문에 이는 흔하지 않습니다. 따라서 grepID 시퀀스가 ​​한 행을 초과하면 어떤 경우에도 실패하게 됩니다. 또한 명령은 이라는 파일 대신 이라는 grep파일을 생성합니다 .SphingopyxisSphingopyxis 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

위의 두 가지 방법 모두 여러 줄의 시퀀스를 처리할 수 있습니다.

관련 정보