遍历bash命令
我需要使用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/
错误的问题,我会假设你的这个命令有效:
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
嗨,谢谢。这工作,但它取代了最终文件,所以我最终只得到一个文件。但我设法修复它使用> $ {f} _filteredc.vcf –
你的Java程序似乎是逐行读取输入。所以,如果你有没有兴趣在具有每输入文件一个文件的输出,你完全可以跳过for循环:
cat *.vcf | java -jar ~/snpEff_latest_core/snpEff/SnpSift.jar/ filter " (QUAL >= 30)" > files_filtered.vcf
这有cat
实际上串联文件,一旦额外的好处。
我得到错误:无法访问jarfile /home/jannahS/snpEff_latest_core/snpEff/SnpSift.jar/当我使用上述命令 –
这很奇怪。我不明白,如果你的第一条命令确实起作用,这将不起作用。 –
看来你最好把文件名/路径作为命令行参数发送到你的Java程序并在内部迭代线路?这似乎是你的意图。 – ray
我看不到问题,但a)不需要'echo'b)你错过了路径中的'〜/'c)这将覆盖'filtered.vcf',更好地使用'> $ {f%.vcf} _filtered.vcf'在结尾 –
尝试:'for f in * .vcf; do java -jar snpEff_latest_core/snpEff/SnpSift.jar/filter“(QUAL> = 30)” filtered.vcf;完成**注:**附加到'filtered.vcf;'使用'>>' –