![Linux - 특정 문자 및 반복 횟수를 기준으로 대용량 파일을 작은 파일로 분할](https://linux55.com/image/214439/Linux%20-%20%ED%8A%B9%EC%A0%95%20%EB%AC%B8%EC%9E%90%20%EB%B0%8F%20%EB%B0%98%EB%B3%B5%20%ED%9A%9F%EC%88%98%EB%A5%BC%20%EA%B8%B0%EC%A4%80%EC%9C%BC%EB%A1%9C%20%EB%8C%80%EC%9A%A9%EB%9F%89%20%ED%8C%8C%EC%9D%BC%EC%9D%84%20%EC%9E%91%EC%9D%80%20%ED%8C%8C%EC%9D%BC%EB%A1%9C%20%EB%B6%84%ED%95%A0.png)
다음과 같은 매우 큰 파일이 있습니다.
>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.subseqaa
file.subseqab
file.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)