bash脚本按顺序执行程序

时间:2013-03-16 22:39:43

标签: bash

我正在尝试使用bash脚本的问题。我有一个包含1000个文件的目录,我想使用每个文件顺序运行命令。但是,每个文件都与另一个文件配对,例如File1.sam,File1.gz,File2.sam,File2.gz等。我正在执行的命令要求我使用一对中的两个文件作为参数。当只需要一个参数时,我一直在使用类似于下面命令的东西,我想(错误地)我可以简单地像下面那样扩展它。

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

任何人都知道如何修改这个或指出我的另一种方式吗?

4 个答案:

答案 0 :(得分: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

答案 1 :(得分: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 :(得分: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

答案 3 :(得分: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