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>秒也没关系。我还是想保留它。到目前为止,我尝试了 split,我认为这在这里不合适,因为它将文件拆分为>每个小文件中的一个。我也尝试过 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

我一直随身携带着几个简单、强大的 awk 脚本,这些脚本是由一位同事几年前编写的,可以在 fasta 和“table”格式之间进行转换。我所说的“表格”格式是指将 fasta 文件转换为每行一个条目,其中序列标识符作为第一个制表符分隔字段,序列作为第二个字段。

你可以找到脚本 这里

使用这些,很容易做你想做的事情,因为表格格式非常适合分割:

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

这将获取输入 fasta 文件file.fa并创建 N 个包含 250 个序列的文件,每行一个序列,名为file.subseqaa, file.subseqab, ..., file.subseqaz。现在,您只需将它们再次更改回 fasta:

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,这可能会抱怨打开的文件过多。

最后,您的脚本无法正常工作,因为您混淆了 shell 和 awk 语法。这$((c%250))是 shell 语法,在 awk 中你只需要if( c % 250 == 0)像我上面使用的那样。

相关内容