그래서 이런 파일이 있는데 각 파일에는 수백 개의 서로 다른 유전자가 있습니다.
>lcl|accession_cds_proteinaccession [gene=dnaA] [protein=description] [protein_id=accession] [location=location]
ATGTCGGAAAAAGAAATTTGGGAAAAAGTGCTTGAAATTGCTCAAGAAAAATTATCAGCTGTAAGTTACT
CAACTTTCCTAAAAGATACTGAGCTTTACACGATTAAAGATGGTGAAGCTATCGTATTATCGAGTATTCC
TTTTAATGCAAATTGGTTAAATCAACAATATGCTGAAATTATCCAAGCAATCTTATTTGATGTTGTAGGC
반복되는 유전자 이름이 많기 때문에 파일 전체에 gene=dnaA가 여러 번 나타날 수 있습니다. 유전자 이름이 반복되면 이름 끝에 2가 추가되도록 이것이 필요합니다. 따라서 파일의 두 번째 중복의 경우 [gene=dnaA]가 [gene=dnaA2]로 변경되고, 세 번째 중복의 경우 [gene=dnaA3]이 [gene=dnaA3]로 변경됩니다. 중요한 것은 유전자 이름이 6번 이상 반복되지 않는다는 것입니다. 샘플 출력은 다음과 같습니다
lcl|accession_cds_proteinaccession [gene=dnaA] [protein=description] [protein_id=accession] [location=location]
ATGTCGGAAAAAGAAATTTGGGAAAAAGTGCTTGAAATTGCTCAAGAAAAATTATCAGCTGTAAGTTACT
CAACTTTCCTAAAAGATACTGAGCTTTACACGATTAAAGATGGTGAAGCTATCGTATTATCGAGTATTCC
lcl|accession_cds_proteinaccession [gene=dnaA2] [protein=description] [protein_id=accession] [location=location]
ATGTCGGAAAAAGAAATTTGGGAAAAAGTGCTTGAAATTGCTCAAGAAAAATTATCAGCTGTAAGTTACT
CAACTTTCCTAAAAGATACTGAGCTTTACACGATTAAAGATGGTGAAGCTATCGTATTATCGAGTATTCC
lcl|accession_cds_proteinaccession [gene=dnaA3] [protein=description] [protein_id=accession] [location=location]
ATGTCGGAAAAAGAAATTTGGGAAAAAGTGCTTGAAATTGCTCAAGAAAAATTATCAGCTGTAAGTTACT
CAACTTTCCTAAAAGATACTGAGCTTTACACGATTAAAGATGGTGAAGCTATCGTATTATCGAGTATTCC
TTTTAATGCAAATTGGTTAAATCAACAATATGCTGAAATTATCCAAGCAATCTTATTTGATGTTGTAGGC
awk를 사용하여 반복되는 단어가 포함된 줄 끝에 문자를 추가하는 방법에 대한 답변을 여기에서 보았습니다(파일에서 중복 항목을 찾아 첫 번째 일치 항목의 줄 끝에 문자를 추가하고 싶습니다.). 하지만 반복되는 단어 끝에 문자를 추가해야 합니다. 여기서 문자는 반복 횟수를 나타냅니다.
나에게 올바른 방향을 알려준다면 큰 도움이 될 것입니다!
감사해요
답변1
펄 한 줄:
perl -pe's/\[gene=([^\]]*)\K\]/$h{$1}++?"$h{$1}]":"]"/e' yourfile
설명하다:
-p
: (저장된) 파일의 각 줄에 대한 코드를 실행하고$_
마지막에 인쇄합니다.$_
-e
: 코드.s/regex/replacement/e
: 성냥정규식그리고 그것을로 교체대안존재하다$_
.
정규식:
/\[gene= # match [gene=
([^\]]*) # match anything but "]" and put it a matching group
\K # don't “take” anything until here
\] # match a literal ]
/x
대안:
condition ? yes : no
: 고전적인 삼항 연산자(return이 있는 경우와 같이 읽음)$h{$1}++
: 첫 번째로 일치하는 그룹의 내용을 해시(dict, map...)에 저장하고 값을 1씩 증가시킵니다.0
처음 발견되면 false를 반환합니다 ."$h{$1}]"
: 값을 읽고$1
문자열에 삽입합니다.
파일 내 교체를 원하는 경우 백업 파일로 끝나는 선택적 파일에 플래그를 제공할 수 있습니다 -i
( 예: 교체하기 전에 를 변경 하고 생성).perl
-i
perl -i'.bak' -pe'…' yourfile
yourfile
yourfile.bak