파일 쌍에 대해 프로세스를 실행하기 위해 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