정확한 일치를 위해 grep을 사용하고, 다른 파일을 찾으려면 목록 파일을 사용하십시오.

정확한 일치를 위해 grep을 사용하고, 다른 파일을 찾으려면 목록 파일을 사용하십시오.

두 개의 파일이 있습니다. 하나는 일부 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

관련 정보