簡體   English   中英

遍歷bash命令

[英]iterate over bash command

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

根據您的問題,我假設您的此命令有效:

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

您的Java程序似乎逐行讀取輸入。 因此,如果您不希望將輸出包含在每個輸入文件一個文件中,則可以完全跳過for循環:

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

這具有cat實際上一次串聯文件的額外好處。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM