awk 用于许多压缩文件
awk for many compressed files
以下命令计算each fasta fastq files的GC含量
使用 find 命令识别。简而言之,fastq 是一个文件,对于大量数据点,该文件有 4 行信息,而我感兴趣的第二行仅包含 (ATGC)。对于测试(相同的)示例文件,可以找到 here).
find . -iname '*.fastq' -exec awk '(NR%4==2) {N1+=length([=10=]);gsub(/[AT]/,"");N2+=length([=10=]);}END{print N2/N1;}' "{}" \;
我怎样才能 modify/rewrite 把它变成一个适用于 gzip 压缩的 fastq 文件的单行代码?我需要当前用于查找的正则表达式选项。
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 {})" \;
在堆栈溢出
中看到很多对find/xargs的引用
如果如您所说,您有很多大文件,我建议您并行处理它们。如果问题是您在引用 awk
时遇到问题,我建议将您的脚本放在一个单独的文件中,称为 script.awk
,如下所示:
(NR%4==2) {N1+=length([=10=]);gsub(/[AT]/,"");N2+=length([=10=]);}END{print N2/N1;}
现在您可以简单地使用 GNU Parallel 并行处理它们:
find . -iname \*fastq.gz -print0 | parallel -0 gzcat {} \| awk -f ./script.awk
以下命令计算each fasta fastq files的GC含量 使用 find 命令识别。简而言之,fastq 是一个文件,对于大量数据点,该文件有 4 行信息,而我感兴趣的第二行仅包含 (ATGC)。对于测试(相同的)示例文件,可以找到 here).
find . -iname '*.fastq' -exec awk '(NR%4==2) {N1+=length([=10=]);gsub(/[AT]/,"");N2+=length([=10=]);}END{print N2/N1;}' "{}" \;
我怎样才能 modify/rewrite 把它变成一个适用于 gzip 压缩的 fastq 文件的单行代码?我需要当前用于查找的正则表达式选项。
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 {})" \;
在堆栈溢出
中看到很多对find/xargs的引用如果如您所说,您有很多大文件,我建议您并行处理它们。如果问题是您在引用 awk
时遇到问题,我建议将您的脚本放在一个单独的文件中,称为 script.awk
,如下所示:
(NR%4==2) {N1+=length([=10=]);gsub(/[AT]/,"");N2+=length([=10=]);}END{print N2/N1;}
现在您可以简单地使用 GNU Parallel 并行处理它们:
find . -iname \*fastq.gz -print0 | parallel -0 gzcat {} \| awk -f ./script.awk