0

使用しようとしている bash スクリプトに問題があります。何千ものファイルを含むディレクトリがあり、各ファイルを使用してコマンドを順番に実行したいと考えています。ただし、各ファイルは別のファイルとペアになっています。たとえば、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

2 番目のファイル名を生成しない理由 (.sam を .gz に置き換えるなど)

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

拡張子の 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ファイル拡張子の 1 つを使用してループを変更し、他のファイル名を計算します。例えば:

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 に答える