2015-11-05 133 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

這很奇怪。我不明白,如果你的第一條命令確實起作用,這將不起作用。 –