
저는 생물정보학 분야의 학부 연구 프로젝트를 진행하고 있으며 파일 처리 파이프라인을 진행하고 있습니다. 몇 가지 배경지식: 저는 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
. cut
SRR 샘플 ID를 추출한 다음 이를 명령과 함께 사용하여 일치 find
하는 파일을 찾습니다 _2
. find
얼마나 많은 결과가 반환될지 모르기 때문에 의 출력은 배열에 저장됩니다.
일치 항목 없음(좋지 않음), 정확히 1개 일치(좋음, 이것이 우리가 원하는 것), 1개 이상 일치(다시 말하지만 좋지 않음)의 세 가지 가능한 결과를 처리합니다.
결과가 하나만 있는 경우 배열에서 일치하는 파일을 추출하고 Perl 스크립트로 처리합니다.
결과가 0개 이상인 경우 stderr에 경고 메시지를 인쇄하고 다음 _1
파일 이름으로 계속 진행합니다. 원하는 경우 이러한 경우 ; exit 1
앞에 추가(또는 오류를 처리하기 위한 다른 코드) 할 수 있습니다 .;;
이는 시작 부분의 SRR 샘플 ID와 정방향 또는 역방향 페어링 파일로 식별하는 _1
또는를 제외한 파일 이름의 모든 부분을 무시합니다._2
if; then; else
그런데 이 작업은 명령문 대신 에 수행할 수 있었지만 case
0개 및 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