file1과 file2에서 일치하는 줄을 인쇄합니다.

file1과 file2에서 일치하는 줄을 인쇄합니다.

file1.txt와 file2.txt가 있습니다. 일치하는 줄을 새 파일로 인쇄하고 싶습니다.

파일 1.txt

FOMPING00002015
FOMPING00008750 
FOMPING00003379 
FOMPING00009073
FOMPING00007164 
FOMPING00009598

파일 2.txt

>FOMPING00013293 Protein of unknown function
ATGCCCTGCTCGTCGCTCGAGCGGGATCATAGCCAGCATGAAGTTATACCGTCATCGCAG
AGCCAGGAACGCGACTTTGTGCCGCCTAATGGTGACATCAGGAGTCGGGCGAGAACGACA
TCCGACGAAATTGTACCCACATCGCAG
>FOMPING00003379 Protein of unknown function
ATGCCCTGCTCGTCGCTCGAGCGGGATCATAGCCAGCATGAAGTTATACCGTCATCGCAG
AGCCAGGAACGCGACTTTGTGCCGCCTAATGGTGACATCAGGAGTCGGGCGAGAACGACA
TCCGACGAAATTGTACCCACATCGCAGTA
>FOMPING00009073 Protein of unknown function 
ATGTCCTCTTGGTCTGGTTCTTCTTACCCTCCACCTCCACGCGCACGTTCGCGCTCTCGC
TCCCCTTATCGTGGGTCTTATCCTGCGAGACCCGGGTATCCAGAGCCTGGATACTCGCAG
>FOMPING00000581 Similar to mcs4: Response regulator mcs4  
ATGTCCTCTTGGTCTGGTTCTTCTTACCCTCCACCTCCACGCGCACGTTCGCGCTCTCGC
TCCCCTTATCGTGGGTCTTATCCTGCGAGACCCGGGTATCCAGAGCCTGGATACTCGCAG
GATCCATACCGTGCCGACTGGGAGGCTTATGACAGAGAGCGCGCATGGGCCTCCTACGAG

여러 명령을 시도했습니다

grep -F file1.txt file2.txt > output.txt
grep -Ff file1.txt file2.txt > output.txt

이 두 명령은 file2.txt의 첫 번째 줄만 출력합니다.

출력.txt

>FOMPING00013293 Protein of unknown function
>FOMPING00000581 Similar to mcs4: Response regulator mcs4.

출력 파일이 시퀀스를 포함하는 file2.txt와 같기를 원합니다.

감사해요

답변1

이것은 내 테스트에서 잘 작동하는 것 같습니다. 비결은 레코드/블록 구분 기호로 ">"를 사용하는 것입니다.

awk 'NR==FNR{a[$0];next};$1 in a{print ">" $0}' file1.txt RS=">" file2.txt
#or alternativelly, due to the whitespace present in the end of each line of file1.txt
awk 'NR==FNR{a[$1];next};$1 in a{print ">" $0}' file1.txt RS=">" file2.txt

RSawk 끝의 위치는 후속 파일에 영향을 줍니다 RS. 내 명령에서는 구문 분석에 기본값 을 file1사용 RS="\n"하지만 .file2RS=">"

답변2

awk두 개의 입력 필드 구분 기호 >및 공백 문자와 함께 사용됩니다.

awk -F'[> ]' '{
  if (NR==FNR){
    a[$1]
  }
  else {
    if (substr($0,0,1) == ">"){
      printline=($2 in a)
    }
    if (printline){
      print
    }
  }
}' file1.txt file2.txt

첫 번째 파일을 처리할 때 첫 번째 필드를 배열에 저장합니다.
두 번째 파일을 처리할 때 현재 줄이 다음으로 시작하는지 테스트 하고 두 번째 필드가 배열에 있는지 테스트하는 >플래그를 설정합니다 . printline플래그가 설정되면 현재 행이 인쇄됩니다.

관련 정보