두 개의 파일이 있습니다. 하나는 일부 ID(텍스트 파일)를 포함하고 다른 하나는 ID와 설명(탭 파일)을 포함합니다.
파일 1:
31120
211890
542312
파일 2:
chr10 31120 A T Descriptions
Chr11 131120 A T Descriptions
chr12 23765090 G C Descriptions
chr15 784930 A G Descriptions
예상 출력:
chr10 31120 A T Descriptions
현재 출력:
Random selected columns some matching the file1 IDs and some not.
grep -f file1 file2 > output.txt
내 ID를 일치시키고 file1
정보를 추출하는 데 사용하고 있습니다 file2
. 그런데 문제는 내 ID가 31120일 때입니다. 31120, 231120, 311200 등과 같은 내 ID를 찾을 수 있습니다.
다른 파일에서 패턴을 찾기 위해 파일을 실행 중이므로 31120만 반환되도록 검색에 특정하게 만들려면 무엇을 사용할 수 있습니까? 일반적인 한 줄 grep 검색에서는 이 작업을 수행하기 쉽지만 두 파일을 비교할 때 이를 수행하는 방법을 모르겠습니다.
사용해 보았 grep -F -f file1 file2
으나 효과가 없었습니다.
이제 grep -Fwf file1 file2를 사용했는데 작동하지 않습니다.
답변1
-w
전체 단어와 일치하도록 추가하면 됩니다 . 패턴이 없고 고정된 문자열이 있으므로 -F
.
$ grep -wFf file1 file2
chr10 31120 A T Descriptions
이 작업에 대한 또 다른 좋은 도구는 이지만 join
기본적으로 join
해당 필드를 먼저 인쇄한 다음 나머지를 인쇄하므로 마음에 들지 않을 수 있습니다.
$ join -2 2 file1 file2
31120 chr10 A T Descriptions
-2 2
두 번째 파일의 연결 필드가 2임을 나타냅니다.
의 경우 join
입력은 조인 필드에서 어휘별로 정렬되어야 합니다. 아직 정렬되지 않았고 쉘이 프로세스 대체(AT&T ksh, zsh, bash)를 지원하는 경우 다음을 수행할 수 있습니다.
join -2 -2 <(sort -k1,1 file1) <(sort -k2,2 file2)
답변2
다른 사람들이 제안했듯이 grep -Fwf file1 file2가 작동해야 합니다.
루프를 사용하려면 다음을 시도하십시오.
for i in `cat file1`; do grep " "${i}" " file2; done