여러 multifasta 파일의 헤더 이름 바꾸기

여러 multifasta 파일의 헤더 이름 바꾸기

P이름 이 PANS_1_2, PANS_1_5, PANS_200_2, 로 시작하는 fasta 파일이 여러 개 있습니다 PANS_200_2.

파일에는 다음과 같은 제목이 있습니다.

>1_1262659_105.258519
>2_809301_107.252177
>3_422941_112.146787
>4_413692_100.238323

이 파일의 헤더 를 filename_ctg1.PANS_1_2

>PANS_1_2_ctg1
>PANS_1_2_ctg2
>PANS_1_2_ctg3

다음 코드를 시도했습니다.

for sample in P*;do echo -en $sample;awk '/>.*/{sub(/[^>]*/,">$sample_ctg"++i)}1' $sample;done > $sample.fasta

언급된 스크립트는 원하는 출력을 생성하지 않습니다.

답변1

그리고 awk:

awk 'FNR==1{ close(out); inc=0; fileName=substr(FILENAME,3); out=fileName".fasta" } 
     /^>/{ $0= ">"fileName"_ctg"(++inc) }
     { print > out }' ./P*

FILENAME현재 처리 중인 입력 파일의 이름을 보유하는 변수입니다. fileName파일 ./이름에 접두사 점 슬래시를 사용하여 ./파일을 읽을 때 이와 같은 이름 의 PANS=1_2문제를 방지합니다.awk로서바꾸다awk코드 뒤에 나타나는 경우 ;

큰따옴표 "..." 안의 모든 내용은 실제로 문자열입니다.

++inc각 헤더에 번호를 매기고 다시 재설정하는 사전 증분 산술 표현식입니다.0FNR==1다음 입력 파일에 사용합니다 .

$0전체 행/레코드를 나타내므로 해당 문자로 시작하는 행을 awk업데이트( ) 한 다음 ">" 문자를 사용합니다.$0= ...>파일 이름그 뒤에는 _ctg문자열과 증분 숫자가 옵니다.

세 번째 줄에서 print현재 줄 값은 현재 줄과 동일한 이름을 가진 파일 이름입니다.파일 이름리더그리고 여기에 ".fasta" 문자열도 추가합니다.

답변2

for 루프에서 GNU sed를 사용합니다.

tmp=$(mktemp)
for sample in ./P*; do
  knt=$(grep -c '^>' < "$sample") || continue
  seq -f ">${sample}_ctg%g" "$knt" > "$tmp"
  sed -e "/^>/R $tmp" -e '//d' < "$sample" > "$sample.fasta"
done
  • 주어진 샘플 파일의 헤더 수를 가져옵니다.
  • 이전 단계의 샘플 파일 이름과 헤더 개수를 기반으로 추가할 헤더를 구성합니다.
  • 각 헤더 줄을 이전 단계에서 빌드한 헤더 파일에서 읽은 다음 줄로 바꿉니다.

관련 정보