Linux - 특정 문자 및 반복 횟수를 기준으로 대용량 파일을 작은 파일로 분할

Linux - 특정 문자 및 반복 횟수를 기준으로 대용량 파일을 작은 파일로 분할

다음과 같은 매우 큰 파일이 있습니다.

>name1
ACGTACGTACGT
ACGTACGTACGT
ACGTACGTACGT
ACGTACGTACGT
>name2
ACGTACGTACGT
ACGTACGTACGT
ACGTACGTACGT
>name
ACGTACGTACGT
ACGTACGTACGT
ACGTACGTACGT
ACGTACGTACGT
ACGTACGTACGT
ACGTACGTACGT
ACGTACGTACGT
ACGTACGTACGT
>name4
ACGTACGTACGT
ACGTACGTACGT
ACGTACGTACGT
ACGTACGTACGT
ACGTACGTACGT

이것은 fasta 파일입니다. (3183 이름)으로 시작하여 약 3183개의 라인이 있고 >그 뒤에 임의의 수의 ACGT 라인이 옵니다. >250초 뒤에 ACGT 줄 수를 추가하는 더 작은 파일 로 분할하고 싶습니다 . 마지막 파일의 길이가 250초가 아니 어도 상관없습니다 >. 나는 아직도 그것을 지키고 싶다. 지금까지 분할을 시도했지만 파일을 >각 작은 파일 중 하나로 분할하기 때문에 여기서는 적절하지 않다고 생각합니다. 나는 또한 awk를 시도했다:

awk -F'>' 'NR==1{f=0;c=1}NR>1{
c++
if($((c%250))==0) {
fn="file"c".fasta";
print > fn}
}' kmer_subtraction/kmercollection.fasta

내 파일을 볼 수 없기 때문에 이것이 작동하는지 잘 모르겠습니다. 이 문제를 해결하는 데 도움을 주실 수 있나요? 감사합니다!

답변1

awk를 사용하십시오.

awk '
    />/ { if ( (++c % 250) == 1 ) { close(fn); fn="file"(++n)".fasta" } }
    { print > fn }
' file.fasta

답변2

저는 몇 년 전에 동료가 fasta 형식과 "테이블" 형식 간에 변환하는 간단하고 강력한 awk 스크립트 몇 개를 보관하고 있습니다. "표 형식" 형식이 의미하는 것은 fasta 파일을 첫 번째 탭 구분 필드로 시퀀스 식별자를 사용하고 두 번째 필드로 시퀀스 식별자를 사용하여 한 줄에 하나의 항목으로 변환하는 것입니다.

스크립트를 찾을 수 있습니다 여기.

표 형식은 분할에 적합하므로 이를 사용하면 원하는 작업을 쉽게 수행할 수 있습니다.

FastaToTbl file.fa > file.tbl
split -l 250 file.tbl file.subseq 

이는 입력 fasta 파일을 가져와 , , ..., file.fa라는 이름의 한 줄에 하나씩 250개의 시퀀스를 포함하는 N개의 파일을 생성합니다 . 이제 다시 fasta로 변경하면 됩니다.file.subseqaafile.subseqabfile.subseqaz

for file in file.subseq*; do
    TblToFasta "$file" > "$file.fa"
    rm  "$file"
done
rm file.tbl

이제 별도의 fasta 파일이 있고 중간 테이블 형식 파일이 삭제되었습니다.


이 작업을 한 번에 수행하기 위해 고유한 작은 스크립트를 작성할 수도 있습니다.

gawk -v n=1 '{ if(/^>/){k++; if(k % 250 == 0){n++; }} print > "file."n".fa"; }' file.fa  

GNU awk를 사용하지 않는 경우 열린 파일이 너무 많다는 불평이 나올 수 있습니다.

마지막으로 쉘과 awk 구문을 혼동했기 때문에 스크립트가 작동하지 않습니다. 이것은 쉘 구문입니다. awk에서는 위에서 했던 것처럼 사용 $((c%250))하면 됩니다 .if( c % 250 == 0)

관련 정보