다른 목록의 내용에 대해 하나의 목록을 grep

다른 목록의 내용에 대해 하나의 목록을 grep

파일이 2개 있는데 그 파일을 grep하고 싶습니다.

목록 1

ACY1
RPL3
RPL4

목록 2

1   ABHD14A-ACY1
2   ACY1
3   RPL34
4   RPL21
5   RPL3
6   RPL41

나는 이런 것을 시도했다

grep -Fwf list1.txt list2.txt그리고 이걸 얻었어

1   ABHD14A-ACY1
2   ACY1
5   RPL3

내 list1에는 ABHD14A-ACY1이 없습니다. grep으로 이를 수행할 수 있는 방법이 있습니까?

감사해요

답변1

-w옵션은 grep전체 단어와 일치합니다. 불행하게도 ABHD14A-ACY1대시 때문에 일치합니다. ACY1패턴 파일에 공백을 추가할 수 있습니다.

sed 's/^/ /' file1 | grep -Fwf- file2
2   ACY1
5   RPL3

답변2

-w스위치는 전체 단어를 구성하는 일치 항목을 반환합니다.

ABHD14A-ACY1그것이 반환되고 반환되지 않는 이유 RPL41ACY1is가 첫 번째와 두 번째 줄의 끝에 있고 RPL4어떤 줄의 시작이나 끝도 아니고 문자, 숫자 내용, 아니면 밑줄을 긋거나. 이에 대해서는 man페이지에 설명되어 있습니다 grep.

이를 테스트하기 위해 1첫 번째 줄 끝에 a를 추가하여 로 만들고, 1 ABHD14A-ACY11여섯 번째 줄 끝에서 1을 제거하여 로 만들면 6 RPL4출력은 다음과 같습니다.

2   ACY1
5   RPL3
6   RPL4

가지고 있는 정확한 명령을 사용하지 않거나 직접 호출하지 않고 첫 번째 줄을 반환할 수 있는 방법은 없습니다 grep. sed첫 번째 줄을 제거하려면 파이프를 연결해야 합니다 .

grep -Fwf list1.txt list2.txt | sed '/ABHD14A/d'

또는 일치시키고 싶지 않은 내용이 포함된 줄만 awk인쇄한 후 반환되는 내용으로 파이프하십시오 .grep

grep -Fwf list1.txt list2.txt | awk 'NR>1'

또는 첫 번째 줄을 제외하려면 grep -v로 파이프하세요.

grep -Fwf list1.txt list2.txt | grep -v ^1

이를 수행하는 다른 방법이 있지만 이 방법이 가장 간단하며 이미 가지고 있는 것을 파이프로 연결할 수 있습니다.

관련 정보