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, 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

관련 정보