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
- 주어진 샘플 파일의 헤더 수를 가져옵니다.
- 이전 단계의 샘플 파일 이름과 헤더 개수를 기반으로 추가할 헤더를 구성합니다.
- 각 헤더 줄을 이전 단계에서 빌드한 헤더 파일에서 읽은 다음 줄로 바꿉니다.