迭代bash命令

时间:2015-11-05 03:41:39

标签: linux bash loops

我需要使用linux bash命令处理我的数据(大约400多个文件)。我正试图找到一种方法将相同的命令迭代到我的所有文件。

这是我的bash命令

cat file1.vcf | java -jar ~/snpEff_latest_core/snpEff/SnpSift.jar/ filter " ( QUAL >= 30 )" > file1_filtered.vcf

我试图这样做但不成功

for f in *.vcf; do echo cat *.vcf | java -jar snpEff_latest_core/snpEff/SnpSift.jar/ filter " ( QUAL >= 30 )" > filtered.vcf; done

这是我得到的错误

Error: Unable to access jarfile snpEff_latest_core/snpEff/SnpSift.jar/
Error: Unable to access jarfile snpEff_latest_core/snpEff/SnpSift.jar/
Error: Unable to access jarfile snpEff_latest_core/snpEff/SnpSift.jar/

2 个答案:

答案 0 :(得分:1)

根据你的问题,我会假设你的这个命令有效:

cat file1.vcf | java -jar ~/snpEff_latest_core/snpEff/SnpSift.jar/ filter " ( QUAL >= 30 )" > file1_filtered.vcf

如果是这种情况,那么我们可以用第二个命令分析差异:

for f in *.vcf; do echo cat *.vcf | java -jar snpEff_latest_core/snpEff/SnpSift.jar/ filter " ( QUAL >= 30 )" > filtered.vcf; done
  1. 第一个命令提供文件的内容作为java脚本的输入。第二个命令提供字符串cat,后跟.vcf文件的名称作为java脚本的输入。

  2. java脚本位于不同的位置。

  3. 要纠正这两个问题,请尝试:

    for f in *.vcf
    do
        java -jar ~/snpEff_latest_core/snpEff/SnpSift.jar/ filter " ( QUAL >= 30 )" <"$f" > filtered.vcf
    done
    

    我还删除了无用的猫。

    最后,每次处理文件时,上面都会覆盖filtered.vcf。如果您希望一个文件包含所有结果,请尝试:

    for f in *.vcf
    do
        java -jar ~/snpEff_latest_core/snpEff/SnpSift.jar/ filter " ( QUAL >= 30 )" <"$f"
    done > filtered.vcf
    

答案 1 :(得分:1)

您的Java程序似乎逐行读取输入。因此,如果您对每个输入文件的输出都不感兴趣,可以完全跳过for循环:

cat *.vcf | java -jar ~/snpEff_latest_core/snpEff/SnpSift.jar/ filter " ( QUAL >= 30 )" > files_filtered.vcf

这具有cat实际连接文件的额外好处,一次。