我正在尝试使用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
任何人都知道如何修改这个或指出我的另一种方式吗?
答案 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