以下命令为每个 fasta fastq files计算GC含量 用find命令标识。简而言之,fastq是一个文件,其中的大量数据点具有4行信息,而我感兴趣的第二行仅包含(ATGC)。对于测试(相同)的示例文件,可以找到here)。
find . -iname '*.fastq' -exec awk '(NR%4==2) {N1+=length($0);gsub(/[AT]/,"");N2+=length($0);}END{print N2/N1;}' "{}" \;
如何将其修改/重写为适用于gziped fastq文件的单行格式?我需要当前与find一起使用的regex选项。
答案 0 :(得分:1)
find
'-exec'可用于调用(和传递参数)到单个程序。这里的挑战是需要将两个命令(cat | awk)与管道结合在一起。两种可能的路径:构造一个shell命令或使用更灵活的xargs。
# Using the 'shell -c' command
find . -iname '*.fastq.gz' -exec sh -c "zcat {} | awk '(NR%4==2) \
{N1+=length(\$0);gsub(/[AT]/,\"\");N2+=length(\$0);}END{print N2/N1;}'" \;
# OR, using process substitution
find . -iname '*.fastq.gz' -exec bash -c "awk '(NR%4==2) \
{N1+=length(\$0);gsub(/[AT]/,\"\");N2+=length(\$0);}END{print N2/N1;}' <(zcat {})" \;
查看许多引用以在堆栈溢出中查找/ xargs
答案 1 :(得分:1)
如果您说的话,如果您有很多大文件,建议您并行处理。如果问题是您在引用awk
时遇到问题,建议您将脚本放在一个单独的文件中,称为script.awk
,如下所示:
(NR%4==2) {N1+=length($0);gsub(/[AT]/,"");N2+=length($0);}END{print N2/N1;}
现在,您可以简单地与 GNU Parallel 并行处理它们:
find . -iname \*fastq.gz -print0 | parallel -0 gzcat {} \| awk -f ./script.awk