2013-03-16 169 views
0

我嘗試使用bash腳本時出現問題。我有一個包含1000個文件的目錄,我希望按順序使用每個文件運行一個命令。但是,每個文件都與另一個文件配對,例如File1.sam,File1.gz,File2.sam,File2.gz等。而我正在執行的命令要求將兩個文件作爲參數使用。當只需要一個參數時,我一直在使用類似於以下命令的東西,並且我認爲(錯誤地)我可以簡單地像下面那樣擴展它。bash腳本按順序執行程序

shopt -s nullglob 
for myfile1 in *.sam && for myfile2 in *.gz 
do 
./bwa samse -r "@RG\tID:$myfile1\tLB:$myfile1\tSM:$myfile1\tPL:ILLUMINA" lope_V1.2.fasta $myfile1 $myfile2 > $myfile1.sam2 2>$myfile1.log 
done 

任何人都知道我可以如何修改這個或以另一種方式指向我?

回答

1
shopt -s nullglob 
for myfile1 in *.sam 
do 
    myfile2=$(echo $myfile1|sed s/.sam$/.gz/) 
    ./bwa samse -r "@RG\tID:$myfile1\tLB:$myfile1\tSM:$myfile1\tPL:ILLUMINA" lope_V1.2.fasta $myfile1 $myfile2 > $saiFile.sam 2>$saiFile.log 
done 
1

僅使用其中一個擴展名(例如*.gz)對文件進行迭代,並使用sed來獲得匹配的.sam文件。

像這樣:

for myfile1 in *.sam 
do 
    sam_name=`echo $myfile | sed -e s#gz\\$#sam#` 
    ./bwa samse -r "@RG\tID:$myfile1\tLB:$myfile1\tSM:$myfile1\tPL:ILLUMINA" lope_V1.2.fasta  $myfile1 $myfile2 > $saiFile.sam 2>$saiFile.log 
done 
2

爲什麼不產生第二文件名,例如以.gz取代.SAM

for myfile1 in *.sam ; do 
    myfile2="${myfile1%.sam}.gz" 
    [ -e "$myfile2" ] || continue 
    ./bwa samse -r "@RG\tID:$myfile1\tLB:$myfile1\tSM:$myfile1\tPL:ILLUMINA" lope_V1.2.fasta "$myfile1" "$myfile2" > "$saiFile".sam 2>"$saiFile".log 
done 
+0

看起來不錯。只有改進的建議是使用更嚴格的PE myfile2 =「$ {myfile1%.sam} .gz」'。 – 2013-03-16 22:47:43

+0

@JoshCartwright謝謝,我更新了帖子 – 2013-03-16 22:50:04

+0

哦,我沒有看到你已經從'。/ bwa'行的引號中刪除了$ myfile1參數擴展。你爲什麼要這麼做?如果文件名有空格,這將會由於分詞而中斷。 – 2013-03-16 22:52:25

0

使用的文件擴展名的一個改變你for環和計算其他文件名。例如:

for p in a b c; do touch $p.1 $p.2; done 
for f in *.1; do g=${f%%.}.2; echo $f $g; done 

這將顯示:

a.1 a.2 
b.1 b.2 
c.1 c.2