Bash 쉘에서 두 개의 파일 세트를 반복합니다.

Bash 쉘에서 두 개의 파일 세트를 반복합니다.

Data라는 폴더에 25개의 관련 파일 쌍이 있습니다. 파일 이름은 내가 도달할 때까지 (또는 내가 가지고 있는 파일 쌍 수) . ,  및 등으로 tcr1_r1.txt지정 됩니다. 내 문제는 이들을 쌍으로 연결하고 배치 파일의 각 쌍에 대해 명령을 실행해야 한다는 것입니다. 예:tcr1_r2.txttcr2_r1.txttcr2_r2.txttcr25…

주문하다  tcr1_r1.txt tcr2_r2.txt
주문하다  tcr2_r1.txt tcr2_r2.txt

어떻게 해야 하나요? 루프를 생각하고 있지만 각 명령에서 파일을 분리하고 교체할 수 없는 것 같습니다. 중첩 루프를 시도했지만 각 "r1" 파일과 모든 "r2" 파일만 실행됩니다.

for filename1 in /Data/*_r1.txt
do
  for filename2 in /Data/*_r2.txt
  do
     echo "$filename1 and $filename2"
  done
done

나는 사용해 보았습니다.제프 샬러의 답변. 내가 시도한 정확한 쉘 파일 라인은 다음과 같습니다.

#!/bin/bash

for first in /mnt/data/Sequencing_core/Data/Raw_data/062419_TCRB_Vanessa_Danielle/20190624_FS10000703_3_BPC29606-1232/Alignment_1/20190625_132145/Fastq/*R1_001.fastq.gz
do

  echo "$first"
  echo "${first/_R1_001.fastq.gz/_R2_001.fastq.gz}" 

done

제가 뭔가를 놓치고 있는 것 같아요. "교체 오류" 오류 메시지가 나타납니다.

답변1

총 파일 수에 관심을 두는지 여부에 따라 두 가지 방법이 있습니다.

첫 번째 방법으로 파일 수가 25개(구체적으로 1~25개)라는 것을 알 수 있습니다.

for index in {1..25}
do
  command tcr"${index}"_r1.txt tcr"${index}"_r2.txt
done

위에서 (bash) 쉘은 {1..25}전체 숫자 세트로 확장됩니다. 그런 다음 해당 숫자를 쌍으로 된 파일 이름의 적절한 위치로 바꿉니다.

두 번째 방법은 파일이 몇 개 있는지 모르거나 신경쓰지 않는 것입니다.

for first in tcr*_r1.txt
do 
  command "$first" "${first/_r1.txt/_r2.txt}"
done

위에서는 모든 "r1" 파일을 반복하고 "_r2.txt" 쌍을 "_r1.txt" 부분으로 바꿉니다.

답변2

그냥 사용할 수 있습니다xargs:

echo /Data/*_r[12].txt | xargs -n 2 the-command

관련 정보