file1의 일치하는 문자열을 file2의 다른 문자열로 바꾸는 방법

file1의 일치하는 문자열을 file2의 다른 문자열로 바꾸는 방법

저는 최근에 bash를 사용하기 시작했으며 일반적으로 수동으로 수행해야 하는 일부 작업을 자동화하기 위해 몇 가지 스크립트를 작성하려는 분자 생물학자입니다.

아래와 같이 두 개의 파일( rev.fasta및 ) 이 있습니다 .index_rev.fasta

$ head rev.fasta
>1
bc-1
>2
bc-1
>3
bc-1
>4
bc-1
>5
bc-1
$ head necessary_files/index_rev.fasta
>rev-bc-1
TGTGTTGAGACCACACAGGCCTCAGTCTCGTGGGCTCGG
>rev-bc-2
GTCTGTCGCCATGGAAAGTCAACTGTCTCGTGGGCTCGG
>rev-bc-3
TTGCTACGGTTGACCATGCAGTTAGTCTCGTGGGCTCGG
>rev-bc-4
AACTTGAGGTATCGTATATTCAATGTCTCGTGGGCTCGG
>rev-bc-5
GCAGGTGGGCATCCGGACCGATATGTCTCGTGGGCTCGG

bash 명령을 작성하고 싶습니다

  1. rev.fasta비슷 하거나 sed 's/>rev-//g' necessary_files/index_rev.fasta유사한 일치grep
  2. (예를 들어) bc-.*$에서 찾은 일치 항목을 (예를 들어) 파일의 다음 줄로 바꿉니다 .rev.fastabc-1necessary_files/index_rev.fastaTGTGTTGAGACCACACAGGCCTCAGTCTCGTGGGCTCGGbc-1

결과는 다음과 같습니다.

>1
TGTGTTGAGACCACACAGGCCTCAGTCTCGTGGGCTCGG
>2
TGTGTTGAGACCACACAGGCCTCAGTCTCGTGGGCTCGG
>3
TGTGTTGAGACCACACAGGCCTCAGTCTCGTGGGCTCGG

노트:

중요할 수 있는 일부 정보: 시작 bc-부터116

어떻게 해야 할지 모르겠습니다. 몇 가지를 시도해 보았지만 이것이 현재 제가 할 수 있는 것보다 더 복잡할 수도 있습니다. 어떤 아이디어가 있나요?

답변1

질문에 대한 나의 이해는 인덱스 파일을 기반으로 fatsa 파일을 검색하고 싶다는 것입니다. 아래 답변에서 인덱스 파일은 Patterns.txt입니다. 또한 프로세스를 테스트하고 시연하기 위해 파일을 일부 변경했습니다. 이 답변을 읽은 후 자신만의 Pattern.txt 파일을 사용할 수 있습니다.

따라서 가정은 다음과 같습니다.

$ cat fasta
>rev-bc-1
TGTGTTGAGACCACACAGGCCTCAGTCTCGTGGGCTCGG
>rev-bc-2
GTCTGTCGCCATGGAAAGTCAACTGTCTCGTGGGCTCGG
>rev-bc-3
TTGCTACGGTTGACCATGCAGTTAGTCTCGTGGGCTCGG
>rev-bc-4
AACTTGAGGTATCGTATATTCAATGTCTCGTGGGCTCGG
>rev-bc-5
GCAGGTGGGCATCCGGACCGATATGTCTCGTGGGCTCGG

$ cat patterns.txt 
>1
bc-4
>2
bc-2

먼저 이 명령을 실행하여 fasta 파일에서 Pattern.txt에 필요한 콘텐츠를 추출합니다.

$ awk '/bc/{print}' patterns.txt | xargs -I{} awk -v q=$(echo {}) '($0 ~ q){getline; print}' fasta
AACTTGAGGTATCGTATATTCAATGTCTCGTGGGCTCGG
GTCTGTCGCCATGGAAAGTCAACTGTCTCGTGGGCTCGG

이 출력을 임시 파일에 저장합니다.

이제 두 번째 명령을 실행하여 최종 결과를 얻으십시오.

awk '!/bc/{print}' patterns.txt | paste -d '\n' - fasout

>1
AACTTGAGGTATCGTATATTCAATGTCTCGTGGGCTCGG
>2
GTCTGTCGCCATGGAAAGTCAACTGTCTCGTGGGCTCGG

설명: 첫 번째 명령은 Pattern.txt에서 bc-1, bc-2 등이 포함된 행을 추출합니다. 그런 다음 해당 줄을 찾기 위해 두 번째 awk(한 번에 하나씩)로 파이프되고 일단 발견되면 awk의 getline 옵션을 사용하여 다음 줄을 인쇄합니다.

두 번째 명령은 단순히 Pattern.txt 파일을 fastout과 병합하여 bc-1, bc-2 등의 행이 fasout의 내용으로 대체되도록 합니다.

이것이 실제로 원하는 솔루션인지 확실하지 않기 때문에 언급하지 않은 몇 가지 주의 사항이 있습니다. 그렇다면 나중에 답변을 수정하여 포함하겠습니다.

관련 정보