2015-11-05 132 views
1

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

这是我的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

看来你最好把文件名/路径作为命令行参数发送到你的Java程序并在内部迭代线路?这似乎是你的意图。 – ray

+1

我看不到问题,但a)不需要'echo'b)你错过了路径中的'〜/'c)这将覆盖'filtered.vcf',更好地使用'> $ {f%.vcf} _filtered.vcf'在结尾 –

+1

尝试:'for f in * .vcf; do java -jar snpEff_latest_core/snpEff/SnpSift.jar/filter“(QUAL> = 30)”< "$f" > filtered.vcf;完成**注:**附加到'filtered.vcf;'使用'>>' –

回答

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脚本位于不同的位置。

要解决这两个问题,尝试:

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

嗨,谢谢。这工作,但它取代了最终文件,所以我最终只得到一个文件。但我设法修复它使用> $ {f} _filteredc.vcf –

0

你的Java程序似乎是逐行读取输入。所以,如果你有没有兴趣在具有每输入文件一个文件的输出,你完全可以跳过for循环:

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

这有cat实际上串联文件,一旦额外的好处。

+0

我得到错误:无法访问jarfile /home/jannahS/snpEff_latest_core/snpEff/SnpSift.jar/当我使用上述命令 –

+0

这很奇怪。我不明白,如果你的第一条命令确实起作用,这将不起作用。 –