저는 생물정보학에 초점을 맞춘 학부 연구 프로젝트를 진행 중이며 파일 처리 과정을 진행하고 있습니다. 몇 가지 배경지식: 저는 A, T, G, C(DNA 샘플의 뉴클레오티드)의 매우 큰 샘플인 샷건 메타게놈 데이터와 제가 수집한 일부 한정자를 사용하여 작업하고 있습니다. 일부 파일을 다듬고 정리하고 일부 한정자를 추가하는 파이프라인의 몇 단계를 완료했습니다. 중요한 것은 이러한 읽기가 대부분 쌍방향 읽기이므로 두 파일 모두 뉴클레오티드를 오른쪽에서 왼쪽으로, 왼쪽에서 오른쪽으로 읽는다는 의미입니다.
그 전에는 기본적으로 생물학과 생태학만 머릿속에 맴돌았기 때문에 코딩이나 일이 어떻게/왜 이루어졌는지, 일반적인 관행/특징 등에 대한 배경 지식이 전혀 없었습니다. 당신은 이해했습니다.
즉, 저는 UNIX에서 매우 기본적인 for 루프 및 문자열 작업을 스스로 배웠고, 다양한 모듈과 기능을 사용하여 다양한 폴더에서 실행되는 일부 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 함수를 사용하라고 제안했고, find의 반환값을 조작변수로 사용하는 방법에 대해서도 이야기했지만, 그래도 같은 문제가 발생할 것 같은 느낌이 듭니다.
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를 추출하는 데 사용되며 , 이 ID는 find
일치하는 파일을 찾기 위해 명령과 함께 사용 됩니다 _2
. find
얼마나 많은 결과가 반환될지 모르기 때문에 의 출력은 배열에 저장됩니다.
일치 항목 없음(나쁨), 정확히 1개 일치(좋음, 이것이 바로 우리가 원하는 것), 1개 이상 일치(다시 말하지만 나쁨)의 세 가지 가능한 결과를 처리합니다.
결과가 하나만 있는 경우 배열에서 일치하는 파일을 추출하고 Perl 스크립트를 사용하여 처리합니다.
결과가 0개 이상인 경우 경고 메시지가 stderr에 인쇄되고 다음 _1
파일 이름으로 처리가 계속됩니다. 원하는 경우 ; exit 1
이러한 상황 이전에 추가(또는 오류를 처리하기 위한 다른 코드)할 수 있습니다.;;
_1
이는 SRR 샘플 ID의 시작 부분과 정방향 또는 역방향 쌍 파일로 식별하는 OR을 제외하고 파일 이름의 모든 부분을 무시합니다 ._2
if; then; else
그건 그렇고, 이것은 문 대신에 할 수 있지만 case
0과 여러 사례를 다르게 처리하는 것이 유용하다고 생각합니다. 예를 들어
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 라인 또는 이와 유사한 것을 사용하고 를 사용하여 실행 가능 플래그를 설정하는 경우 chmod +x
) /home/gomeza/shared/sharm646-2021-02-24-09_22/Softwares/NGSQCToolkit_v2.3.3/Trimming/
$PATH에 추가하면 됩니다.
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