awk,用于许多压缩文件

时间:2019-10-24 13:29:36

标签: shell awk gzip

以下命令为每个 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选项。

2 个答案:

答案 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