2013-03-16 178 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