ファイルペアに対してプロセスを実行するために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
、、、、、、)をサポートしている場合:zsh
mksh
yash
bash
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}
答え2
私が探しているものを理解したと仮定すると、次のように問題を解決できますawk
。
#!/bin/bash
for file in *_R1_*; do
file=`basename $file`
newFile=`echo $file | awk -F '_R1_' '{print $1}'`_R2_`echo $file | awk -F '_R1_' '{print $2}'`
sName=`echo $file | awk -F '_R1_' '{print $1}'`_singles_`echo $file | awk -F '_R1_' '{print $2}'`
echo $newFile
rName="$newFile"
oName="trimmed_$file"
pName="$file"
done