텍스트파일에서 특정 문자열을 포함하는 라인을 추출하고자 할 때 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 파라미터로 검색할 문자열을 줄바꿈으로 구분된 리스트 파일로 받아 해당 파일 내의 문자열들을 인풋 파일에서 검색해 존재하는 라인을 출력해준다.
리스트의 내용이 인풋 파일에서 한 줄에 중복되어 여러 줄 존재해도 같은 라인을 중복해서 출력하지는 않는다.
참고
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
'Linux' 카테고리의 다른 글
cnv calling R package [cn.mops] 설치하기 (0) | 2022.07.24 |
---|---|
old version R ubuntu local에 설치하기 (0) | 2022.07.24 |
윈도우 -> 리눅스 텍스트파일 개행문자 제거 (0) | 2021.05.15 |
[Genomics data processing] awk를 이용해서 bed format 을 chromosome 별로 분리하기 (0) | 2021.01.23 |