본문 바로가기

Linux

리스트를 파일로 만들어두고 grep 수행하기

텍스트파일에서 특정 문자열을 포함하는 라인을 추출하고자 할 때 grep 을 자주 쓰는데

가끔 특정 문자열이 2개 이상일 때, 어떤 리스트 형태의 문자열들을 검색 대상인 텍스트파일에서 찾고 싶은 경우가 있다.

 

이를 테면 아래와 같이 Target gene list 가 있고, 전체 gene list에 대한 annotation file이 있을때 

 

# target_genelist.txt
gene1
gene2
gene5

 

 

#all.gene.annotation.bed
chr1 11011 11040 gene1
chr1 1101144 1104090 gene2
chr1 2311011 2511040 gene3
chr1 3411011 3911040 gene4
chr1 11011011 11016040 gene5

 

다음과 같이 Target gene 에 해당하는 annotation 정보를 추출하고 싶을 때! 

 

#desired_results.txt
chr1 11011 11040 gene1
chr1 1101144 1104090 gene2
chr1 11011011 11016040 gene5

 

물론 간단한 프로그램을 작성해서 해결할 수도 있는 문제이긴 하나, 간단한 프로그램을 작성해서 해결하는 문제일수록 리눅스의 다양한 커맨드를 이용해서 더 간단하게도 해결할 수 있을 가능성이 높다!! 

그리고 이번 문제는 다음 한 줄의 커맨드로 해결할 수 있다. 

 

grep -f target_genelist.txt   all.gene.annotation.bed > desired_results.txt

 

grep으로 검색할 문자열을 직접 써주는 대신 -f 파라미터로 검색할 문자열을 줄바꿈으로 구분된 리스트 파일로 받아 해당 파일 내의 문자열들을 인풋 파일에서 검색해 존재하는 라인을 출력해준다. 

리스트의 내용이 인풋 파일에서 한 줄에 중복되어 여러 줄 존재해도 같은 라인을 중복해서 출력하지는 않는다.

 

 

참고

https://stackoverflow.com/questions/17863301/how-to-grep-with-a-list-of-words?answertab=oldest#tab-top 

 

How to grep with a list of words

I have a file A with 100 words in it separated by new lines. I would like to search file B to see if ANY of the words in file A occur in it. I tried the following but does not work to me: grep -F...

stackoverflow.com

 

반응형