발생 순서에 따라 반복되는 단어에 연속된 문자를 추가합니다.

발생 순서에 따라 반복되는 단어에 연속된 문자를 추가합니다.

그래서 이런 파일이 있는데 각 파일에는 수백 개의 서로 다른 유전자가 있습니다.

>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-iperl -i'.bak' -pe'…' yourfileyourfileyourfile.bak

관련 정보