for 루프를 사용하여 다양한 파일에서 .extension 앞의 임의 문자 4개를 제거하는 방법은 무엇입니까?

for 루프를 사용하여 다양한 파일에서 .extension 앞의 임의 문자 4개를 제거하는 방법은 무엇입니까?

저는 생물정보학 분야의 학부 연구 프로젝트를 진행하고 있으며 파일 처리 파이프라인을 진행하고 있습니다. 몇 가지 배경지식: 저는 A,T,G,C(DNA 샘플의 뉴클레오티드)의 매우 큰 견본인 산탄총 메타게놈 데이터와 제가 수집한 것에서 일부 한정자를 사용하여 작업하고 있습니다. 나는 몇 가지 한정자를 추가하는 것과 함께 일부 파일을 다듬고 정리하는 파이프라인의 몇 단계를 이미 거쳤습니다. 중요한 것은 이러한 읽기가 대부분 쌍을 이루는 끝 읽기라는 것입니다. 즉, 두 파일이 뉴클레오티드를 오른쪽에서 왼쪽으로, 왼쪽에서 오른쪽으로 읽는다는 의미입니다.

그 전에는 기본적으로 생물학과 생태학만 머리에 집어넣었기 때문에 코딩에 대한 맥락이나 일을 수행하는 방법/이유, 일반적인 관행/기능 등에 대한 내용이 전혀 없었습니다. 요점을 알겠습니다.

즉, 저는 UNIX에서 매우 기본적인 루프 및 문자열 조작 방법을 스스로 배웠고, 다양한 모듈과 기능을 사용하여 다양한 폴더를 통해 실행되는 일부 bash 파일을 만들었습니다. 예제 코드는 다음과 같습니다.

cd ~/ncbi/public/sra/indian

for forward_read_file in *_1.fastq

do
rev=_2
reverse_read_file=${forward_read_file/_1/$rev}
perl /home/gomeza/shared/sharm646-2021-02-24-09_22/Softwares/NGSQCToolkit_v2.3.3/Trimming/AmbiguityFiltering.pl -i ${forward_read_file} -irev ${reverse_read_file} -c 1 -t5 -t3

rm ${forward_read_file} ${reverse_read_file}
done

#CAMEROON
cd ~/ncbi/public/sra/cameroon

for forward_read_file in *_1.fastq

do
rev=_2
reverse_read_file=${forward_read_file/_1/$rev}
perl /home/gomeza/shared/sharm646-2021-02-24-09_22/Softwares/NGSQCToolkit_v2.3.3/Trimming/AmbiguityFiltering.pl -i ${forward_read_file} -irev ${reverse_read_file} -c 1 -t5 -t3

rm ${forward_read_file} ${reverse_read_file}
done 

많은 폴더에 대해 등등. 문자열 조작을 사용하여 for 루프의 각 반복을 통해 쌍을 이루는 최종 파일을 호출한 다음 사용 중인 모듈에 대한 일부 인수와 매개 변수를 가져왔습니다.

지금 직면하고 있는 가장 큰 문제는 파이프라인의 다음 단계를 위해 쌍을 이루는 최종 파일을 쌍으로 묶는 방법을 생각할 수 없다는 것입니다. 확장 바로 앞에 임의의 문자 4개가 있고 이를 예측할 수 없기 때문입니다. 의미 있는 데이터가 포함되어 있지 않기 때문에 파일 이름에서 삭제하고 지금까지 해왔던 대로 진행할 계획입니다.

다음은 문제 파일의 예입니다. 문제는 문자열 끝에 있는 4개의 문자입니다. 이를 제거하면 평소처럼 문자열 조작을 수행할 수 있습니다.

SRR5898908_1_prinseq_good_ZsSX.fastq  SRR5898928_2_prinseq_good_VygO.fastq  SRR5898979_1_prinseq_good_CRzI.fastq  SRR6166642_2_prinseq_good_nqVP.fastq  SRR6166693_2_prinseq_good_y_OD.fastq
SRR5898908_2_prinseq_good_HPTU.fastq  SRR5898929_1_prinseq_good_p2mS.fastq  SRR5898979_2_prinseq_good_vYcE.fastq  SRR6166643_1_prinseq_good_fc8y.fastq  SRR6166694_1_prinseq_good_Ka1C.fastq
SRR5898909_1_prinseq_good_X41r.fastq  SRR5898929_2_prinseq_good_uO8g.fastq  SRR5898980_1_prinseq_good_WuPS.fastq  SRR6166643_2_prinseq_good_QUUK.fastq  SRR6166694_2_prinseq_good_ZlNk.fastq
SRR5898909_2_prinseq_good_GbmA.fastq  SRR5898930_1_prinseq_good_3qyA.fastq  

여기서 시작 SRRxxxxx는 샘플이고1또는2각각 정방향 및 역방향 읽기이므로 문자열 조작이 가능합니다. 문제는 문자열 끝에 있는 4개의 문자입니다. 이를 제거하면 평소처럼 문자열 조작을 수행할 수 있습니다. 멘토는 FIND나 CUT 기능을 어떻게든 사용하라고 권했고, 찾기의 반환값을 변수로 사용하여 조작하는 방법에 대해 이야기했지만 여전히 같은 문제가 발생할 것 같습니다.

for 루프를 사용하여 이러한 문자를 어떻게 안전하게 제거할 수 있나요? 아니면 무엇이든 가장 잘 작동할 것이라고 생각합니다.

감사합니다!

답변1

다음과 같이 시도해 보십시오.

for forward_read_file in *_1*.fastq; do
   srr=$(echo "$forward_read_file" | cut -d_ -f1)
   rrf_array=( $(find . -name "${srr}_2_*.fastq") )

   case "${#rrf_array[@]}" in
     0) echo "Warning: No reverse read file found for $forward_read_file" > /dev/stderr ;;

     1) reverse_read_file="${rrf_array[1]}"
        perl /home/gomeza/shared/sharm646-2021-02-24-09_22/Softwares/NGSQCToolkit_v2.3.3/Trimming/AmbiguityFiltering.pl -i "$forward_read_file" -irev "$reverse_read_file" -c 1 -t5 -t3
        ;;

     *) echo "Error: multiple reverse read files found for $forward_read_file" > /dev/stderr ;;
   esac

done

이는 모든 파일을 반복합니다 _1. cutSRR 샘플 ID를 추출한 다음 이를 명령과 함께 사용하여 일치 find하는 파일을 찾습니다 _2. find얼마나 많은 결과가 반환될지 모르기 때문에 의 출력은 배열에 저장됩니다.

일치 항목 없음(좋지 않음), 정확히 1개 일치(좋음, 이것이 우리가 원하는 것), 1개 이상 일치(다시 말하지만 좋지 않음)의 세 가지 가능한 결과를 처리합니다.

결과가 하나만 있는 경우 배열에서 일치하는 파일을 추출하고 Perl 스크립트로 처리합니다.

결과가 0개 이상인 경우 stderr에 경고 메시지를 인쇄하고 다음 _1파일 이름으로 계속 진행합니다. 원하는 경우 이러한 경우 ; exit 1앞에 추가(또는 오류를 처리하기 위한 다른 코드) 할 수 있습니다 .;;

이는 시작 부분의 SRR 샘플 ID와 정방향 또는 역방향 페어링 파일로 식별하는 _1또는를 제외한 파일 이름의 모든 부분을 무시합니다._2

if; then; else그런데 이 작업은 명령문 대신 에 수행할 수 있었지만 case0개 및 2개 이상의 사례를 다르게 처리하는 것이 유용하다고 생각했습니다. 예를 들어

if [ "${#rrf_array[@]}" == 1 ]; 
  reverse_read_file="${rrf_array[1]}"
  perl /home/gomeza/shared/sharm646-2021-02-24-09_22/Softwares/NGSQCToolkit_v2.3.3/Trimming/AmbiguityFiltering.pl -i "$forward_read_file" -irev "$reverse_read_file" -c 1 -t5 -t3
else
  echo "Warning: unknown problem with reverse read file for $forward_read_file" > /dev/stderr
fi

"문제" 파일을 무시하고 싶다면 else블록을 삭제하세요.


그런데, 스크립트를 더 읽기 쉽게 만들려면 스크립트 상단 근처에서 다음과 같은 작업을 수행하는 것이 좋습니다.

AFilter='/home/gomeza/shared/sharm646-2021-02-24-09_22/Softwares/NGSQCToolkit_v2.3.3/Trimming/AmbiguityFiltering.pl'

그리고 나중에:

perl "$AFilter" -i "$forward_read_file" -irev "$reverse_read_file" -c 1 -t5 -t3

또는 Perl 스크립트가 실행 가능한 경우(예: #!/usr/bin/perl또는 유사한 shebang 줄을 사용하고 실행 가능 플래그가 로 설정된 경우 ) $PATH에 chmod +x추가하면 됩니다 ./home/gomeza/shared/sharm646-2021-02-24-09_22/Softwares/NGSQCToolkit_v2.3.3/Trimming/

PATH="$PATH:/home/gomeza/shared/sharm646-2021-02-24-09_22/Softwares/NGSQCToolkit_v2.3.3/Trimming"

다음과 같이 스크립트를 실행합니다.

AmbiguityFiltering.pl -i "$forward_read_file" -irev "$reverse_read_file" -c 1 -t5 -t3

답변2

제목에서 이름을 바꾸는 것이 무슨 뜻인가요?

이와 같이:

cat a2 | sed -e 's|\(.*\)\(good_\)\(.*\)\(.fastq\)|mv \1\2\3\4 \1\2\4|'
mv SRR5898908_1_prinseq_good_ZsSX.fastq SRR5898908_1_prinseq_good_.fastq
mv SRR5898928_2_prinseq_good_VygO.fastq SRR5898928_2_prinseq_good_.fastq

관련 정보