【问题标题】:iterate over bash command遍历 bash 命令
【发布时间】:2015-11-05 03:41:39
【问题描述】:

我需要使用 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/

【问题讨论】:

  • 看来您最好将文件名/路径作为命令行参数发送到您的 Java 程序并在内部迭代这些行?这似乎是你的意图。
  • 我看不到问题,但是 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 )" < "$f" > filtered.vcf; done 注意: 附加到filtered.vcf; 使用>>

标签: linux bash loops


【解决方案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

我还删除了 cat 的无用用法。

最后,每次处理文件时,上述内容都会覆盖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 修复它
【解决方案2】:

您的 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/
  • 这很奇怪。如果您的第一个命令有效,我不明白这怎么行不通。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-03
  • 2013-12-26
  • 2021-01-02
  • 1970-01-01
  • 2017-06-05
  • 2012-10-28
  • 1970-01-01
相关资源
最近更新 更多