forループはファイル名の先頭と終了の両方を一致させます。

forループはファイル名の先頭と終了の両方を一致させます。

ファイルペアに対してプロセスを実行するためにforループを設定しようとしています。ファイル名は次のとおりです。

36_002_CGATGT_L001_R1_005.fastq.gz
36_002_CGATGT_L001_R2_005.fastq.gz

36_002_CGATGT_L001_R1_002.fastq.gz
36_002_CGATGT_L001_R2_002.fastq.gz

62_013_AGTCAA_L001_R1_003.fastq.gz
62_013_AGTCAA_L001_R2_003.fastq.gz

次のコマンドで各ペアを使用する必要があります。

sickle pe -f 36_002_CGATGT_L001_R1_005.fastq.gz \
 -r 36_002_CGATGT_L001_R2_005.fastq.gz\
 -o trimmed_36_002_CGATGT_L001_R1_005.fastq.gz\
 -p trimmed_36_002_CGATGT_L001_R2_005.fastq.gz\
 -s 36_002_CGATGT_L001_singles_005.fastq.gz

まず努力しています。

for n in *R1*; do m='basename $n R2' ; echo $m; done

しかし、明らかに、この方法はファイル名の前半と終わりの両方が重要であるため機能しません。 R1とR2が名前の最後の部分になるようにファイル名を変更する必要がありますか?厄介ですが、不可能ではありません

ベストアンサー1

シェルがkshスタイルパラメータ${var/search/replace}拡張(ksh93、、、、、、)をサポートしている場合:zshmkshyashbash

for r1 in *R1*; do
  r2=${r1/R1/R2}
  singles=${r1/R1/singles}
  trimmed1=trimmed$r1
  trimmed2=trimmed$r2
  sickle pe -f "$r1" \
   -r "$r2" \
   -o "$trimmed1" \
   -p "$trimmed2" \
   -s "$singles"
done

POSIXly、あなたはできます

 r2=${r1%%R1*}R2${r1#*R1}

おすすめ記事