0

我尝试使用的 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

4 回答 4

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
于 2013-03-16T22:43:33.680 回答
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
于 2013-03-16T22:41:24.823 回答
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
于 2013-03-16T22:44:09.637 回答
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
于 2013-03-16T22:49:14.847 回答