[英]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
第一個命令將文件的內容提供給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
您的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.