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
RS
awk 끝의 위치는 후속 파일에 영향을 줍니다 RS
. 내 명령에서는 구문 분석에 기본값 을 file1
사용 RS="\n"
하지만 .file2
RS=">"
답변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
플래그가 설정되면 현재 행이 인쇄됩니다.