나는 현재 스캐폴딩이 포함된 대용량 fasta 파일(3.7GB)을 작업 중입니다. 각 비계에는 첫 번째 행부터 시작하여 고유한 식별자가 있으며 >
, 연속 행에는 다음과 같은 DNA 서열이 있습니다.
>9999992:0-108
AAAGAATTGTATTCCCTCCAGGTAGGGGGGATAGTTGAGGGGATACATAG
TGGGAAGGCTTTTCATGCGGAGGGACTAGAATGTGCTCCCGACTGACAAA
GCAGCTTG
>9999993:0-118
AGGGACTAGAAATGAGATTAAAAAGAGTAAAAGCACTGATACAAGTACAA
AAACAAATTGCTTCACCTCCAAAACCCCAGAAACTGCCCCACTTGGCTCC
CATTTAACCTACCTTCAA
>9999994:0-113
CCATCCTCATCCTTTCCTCCCCATATCTTCCTCTGACCCCAAAGCTCAGG
TTTCCTGTCTTGTTTCCCAGAATCTGTACCTCATGGTAGTTAAACCTTCC
CCTCTGGCAGCCA
>9999997:0-87
AACATCCCTGTGGCCTGAGAGACTGCCAGCCACAGCGGTGACAGTCCCTG
CGAGAGGCTGCTGCAAAAAGACTGGAGAGAAAGCAGA
>9999998:0-100
AAACATCAGCGCCAAGTCCCCGAAACCAGCAGGGTCACTGGGCGGCCGGC
CTGAAATACCCCAGCAGGCCAGCAGTGCCGGGTGCCTGGGGAGGTGTCCT
>9999999:0-94
AAGAAACTTTTCCCTTAACCAATGAAGAGTTTTATGTAAAGGAAATTTAG
TAATTTTTTAAAAAATGGTAATGACAGATTTAAGTAATTTAATT
파일을 동일한 길이의 더 작은 파일로 분할하여 처리하고 싶지만 ID와 시퀀스를 모두 존중하여 다음과 같은 결과를 얻어야 합니다.
file1.fa
>9999992:0-108
AAAGAATTGTATTCCCTCCAGGTAGGGGGGATAGTTGAGGGGATACATAG
TGGGAAGGCTTTTCATGCGGAGGGACTAGAATGTGCTCCCGACTGACAAA
GCAGCTTG
>9999993:0-118
AGGGACTAGAAATGAGATTAAAAAGAGTAAAAGCACTGATACAAGTACAA
AAACAAATTGCTTCACCTCCAAAACCCCAGAAACTGCCCCACTTGGCTCC
CATTTAACCTACCTTCAA
file2.fasta
>9999994:0-113
CCATCCTCATCCTTTCCTCCCCATATCTTCCTCTGACCCCAAAGCTCAGG
TTTCCTGTCTTGTTTCCCAGAATCTGTACCTCATGGTAGTTAAACCTTCC
CCTCTGGCAGCCA
>9999997:0-87
AACATCCCTGTGGCCTGAGAGACTGCCAGCCACAGCGGTGACAGTCCCTG
CGAGAGGCTGCTGCAAAAAGACTGGAGAGAAAGCAGA
file3.fasta
>9999998:0-100
AAACATCAGCGCCAAGTCCCCGAAACCAGCAGGGTCACTGGGCGGCCGGC
CTGAAATACCCCAGCAGGCCAGCAGTGCCGGGTGCCTGGGGAGGTGTCCT
>9999999:0-94
AAGAAACTTTTCCCTTAACCAATGAAGAGTTTTATGTAAAGGAAATTTAG
TAATTTTTTAAAAAATGGTAATGACAGATTTAAGTAATTTAATT
도와주세요. grep을 사용해 보았 csplit
으나 잘못된 결과가 나왔습니다.
답변1
아래 코드는 도움이 될 수 있지만 컴퓨터 사양에 따라 대용량 파일의 경우 속도가 느려질 수 있습니다.
첫째, 당신이 얻어야 할 총 개수입니다 Unique Identifier
. 다음을 사용하여 이를 달성할 수 있습니다.grep -c
total=$(grep -c "^>" largeFastaFile.txt)
위의 코드는 total
로 시작하는 일치하는 줄의 개수를 변수에 할당합니다 >
. 이제 Unique Identifier
각 파일의 번호를 얻어야 합니다 . 그러니 갖고 싶다면10개 파일. 당신은 나누어야합니다 total/10
:
max=$((total/10))
#If total has 3714529 then max will have 371,452.
마지막으로 awk
다음 명령을 사용하여 대용량 파일을 10개의 파일로 분할할 수 있습니다(실제로 11) 에 대한371,452개의 고유 식별자각 파일:
awk -v maxline=$max -v count=0\
'{if(NR>1) { if( (NR-2)%maxline == 0 ) count++ ; print ">"$0 >("file"count".fasta") } }'\
RS='>' largeFastaFile.txt
스크립트는 다음과 같아야 합니다.
#!/bin/bash
total=$(grep -c "^>" largeFastaFile.txt)
max=$((total/10)) # where 10 is the number of files you will get
awk -v maxline=$max -v count=0 '{if(NR>1) { if( (NR-2)%maxline == 0 ) count++ ; print ">"$0 >("file"count".fasta") } }' RS='>' largeFastaFile.txt
실제로 총 3714529
10개의 파일이 있고 371,452 Unique Identifier
각 파일의 수가 동일하면 다른 파일에 여러 줄이 있어야 하므로 실제로 11개의 파일을 얻게 됩니다.
371,452 * 10 = 3,714,520
그래서번호 11파일은 마지막9 고유 식별자
답변2
나는 fasta와 tbl(시퀀스 식별자, TAB, 단일 라인 시퀀스) 형식 사이를 변환하기 위해 몇 년 전에 옛 동료가 작성한 스크립트 몇 개를 사용해 왔습니다. 스크립트를 게시했습니다.여기. 이를 사용하면 파일을 한 줄당 시퀀스로 쉽게 변환한 다음 분할하여 각 파일에 원하는 줄 수를 지정한 다음 분할 파일을 다시 fasta로 변환할 수 있습니다.
FastaToTbl file.fa | split -l 2 - splitFile
샘플 입력을 사용하여 다음 파일을 만듭니다.
$ for f in splitFile*; do printf "\n===== File: %s ====\n" "$f"; cat "$f"; done
===== File: splitFileaa ====
9999992:0-108 AAAGAATTGTATTCCCTCCAGGTAGGGGGGATAGTTGAGGGGATACATAGTGGGAAGGCTTTTCATGCGGAGGGACTAGAATGTGCTCCCGACTGACAAAGCAGCTTG
9999993:0-118 AGGGACTAGAAATGAGATTAAAAAGAGTAAAAGCACTGATACAAGTACAAAAACAAATTGCTTCACCTCCAAAACCCCAGAAACTGCCCCACTTGGCTCCCATTTAACCTACCTTCAA
===== File: splitFileab ====
9999994:0-113 CCATCCTCATCCTTTCCTCCCCATATCTTCCTCTGACCCCAAAGCTCAGGTTTCCTGTCTTGTTTCCCAGAATCTGTACCTCATGGTAGTTAAACCTTCCCCTCTGGCAGCCA
9999997:0-87 AACATCCCTGTGGCCTGAGAGACTGCCAGCCACAGCGGTGACAGTCCCTGCGAGAGGCTGCTGCAAAAAGACTGGAGAGAAAGCAGA
===== File: splitFileac ====
9999998:0-100 AAACATCAGCGCCAAGTCCCCGAAACCAGCAGGGTCACTGGGCGGCCGGCCTGAAATACCCCAGCAGGCCAGCAGTGCCGGGTGCCTGGGGAGGTGTCCT
9999999:0-94 AAGAAACTTTTCCCTTAACCAATGAAGAGTTTTATGTAAAGGAAATTTAGTAATTTTTTAAAAAATGGTAATGACAGATTTAAGTAATTTAATT
-l 2
각 파일을 원하는 시퀀스 수로 변경합니다. 그런 다음 분할된 파일을 반복하여 각각을 fasta로 변환합니다.
c=0
for f in splitFile*; do
outFile=file.$((++c)).fa
TblToFasta "$f" > "$outFile"
done
그러면 다음 파일이 생성됩니다.
$ for f in file.*.fa; do printf "\n===== File: %s ====\n" "$f"; cat "$f"; done
===== File: file.1.fa ====
>9999992:0-108
AAAGAATTGTATTCCCTCCAGGTAGGGGGGATAGTTGAGGGGATACATAGTGGGAAGGCT
TTTCATGCGGAGGGACTAGAATGTGCTCCCGACTGACAAAGCAGCTTG
>9999993:0-118
AGGGACTAGAAATGAGATTAAAAAGAGTAAAAGCACTGATACAAGTACAAAAACAAATTG
CTTCACCTCCAAAACCCCAGAAACTGCCCCACTTGGCTCCCATTTAACCTACCTTCAA
===== File: file.2.fa ====
>9999994:0-113
CCATCCTCATCCTTTCCTCCCCATATCTTCCTCTGACCCCAAAGCTCAGGTTTCCTGTCT
TGTTTCCCAGAATCTGTACCTCATGGTAGTTAAACCTTCCCCTCTGGCAGCCA
>9999997:0-87
AACATCCCTGTGGCCTGAGAGACTGCCAGCCACAGCGGTGACAGTCCCTGCGAGAGGCTG
CTGCAAAAAGACTGGAGAGAAAGCAGA
===== File: file.3.fa ====
>9999998:0-100
AAACATCAGCGCCAAGTCCCCGAAACCAGCAGGGTCACTGGGCGGCCGGCCTGAAATACC
CCAGCAGGCCAGCAGTGCCGGGTGCCTGGGGAGGTGTCCT
>9999999:0-94
AAGAAACTTTTCCCTTAACCAATGAAGAGTTTTATGTAAAGGAAATTTAGTAATTTTTTA
AAAAATGGTAATGACAGATTTAAGTAATTTAATT
사용되는 두 가지 스크립트는 다음과 같습니다.
Tbl을 빠르게 변환하세요
#!/usr/bin/awk -f { if (substr($1,1,1)==">") if (NR>1) printf "\n%s\t", substr($0,2,length($0)-1) else printf "%s\t", substr($0,2,length($0)-1) else printf "%s", $0 }END{printf "\n"}
TblToFasta
#! /usr/bin/awk -f { sequence=$NF ls = length(sequence) is = 1 fld = 1 while (fld < NF) { if (fld == 1){printf ">"} printf "%s " , $fld if (fld == NF-1) { printf "\n" } fld = fld+1 } while (is <= ls) { printf "%s\n", substr(sequence,is,60) is=is+60 } }
파일에 저장 $PATH
하고 실행 가능하게 만듭니다.