我有一个像这样的目录树:
Data/bacteria_splitted/GeneraName/chromosomes/*.fna.gz
其中 *fna.gz 是压缩的 fasta 文件:
>header
string sequence
每个 GeneraName/chromosomes 目录都有 1 到 1500 个 gzip fasta 文件,我想要/需要在这些目录的数据中运行一个名为 jellyfish 的工具(计算输入 fasta 文件中的子词/n-grams/kmers)('Data/bacteria_splitted) /属名/染色体')。
我想将结果(mer_counts.jf)放入
Results/GeneraName/chromosomes/kmers3(if i am count words with length 3)
但是 jellyfish 无法在 gzip 文件中工作,然后我需要解压缩并将文件通过管道传递给 jellyfish。手册说我可以使用发电机:
“如何一次读取多个文件?通常,jellyfish 解析输入序列文件的速度比 gzip 或 fastq-dump(用于解析 SRA 文件)输出序列的速度更快。这导致 jellyfish 中的许多线程部分未使用。Jellyfish 可以指示一次打开多个文件,例如,同时读取两个短读存档文件:
jellyfish count -F 2 <(fastq-dump -Z file1.sra) <(fastq-dump -Z file2.sra) ...
另一种方法是使用“生成器”。首先,创建一个文件,其中每行一个命令,用于生成序列。然后将此文件传递给 jellyfish 和同时运行的生成器数量。 Jellyfish 将生成运行传递的命令的子进程,并读取其标准输出以进行序列。默认情况下,命令是使用 SHELL 环境变量中的 shell 运行的,这可以通过 -S 开关进行更改。多个生成器将按照 -G 开关的指定同时运行。例如:
ls *.fasta.gz | xargs -n 1 echo gunzip -c > generators
jellyfish count -g generators -G 4 ...
第一个命令将命令列表创建到“generators”文件中,每个命令在当前目录中解压缩一个 FASTA 文件。第二个命令使用 4 个并发生成器运行 jellyfish。”
生成器是这样的文件:
gunzip -c NC_009484.1_Acidiphilium_cryptum_JF_5_complete_genome.fna.gz
gunzip -c NC_015186.1_Acidiphilium_multivorum_AIU301_complete_genome.fna.gz
我得到这样的东西:
#!usr/bin/env bash
echo "Counting k-mers with JellyFish"
input='teste_name.txt'
while IFS= read -r line
do
echo "Counting kmers in $line genomes"
ls test/$line/chromosomes/*.fna.gz | xargs -n 1 echo gunzip -c > generators
jellyfish count -g generators -m 4 -s 100M -o $line'_4'.jf
done < "$input"
但我需要改进它,因为我要为每个属读取不同数量的 os fasta 文件,并且根据我的理解,如果我使用生成器,我只会按属计算 1 个 fasta 文件,如果我可以预测生成器的数量,则不会计算出我需要的全部内容。因为当前的计数会覆盖之前的计数。我有什么办法可以解决这个问题吗?我对 bash 没有太多经验,所以......任何帮助都会很棒。谢谢。保罗