我需要使用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/
答案 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
第一个命令提供文件的内容作为java脚本的输入。第二个命令提供字符串cat
,后跟.vcf
文件的名称作为java脚本的输入。
java脚本位于不同的位置。
要纠正这两个问题,请尝试:
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
实际连接文件的额外好处,一次。