다른 파일의 단어 목록과 일치하는 줄 추출

다른 파일의 단어 목록과 일치하는 줄 추출

내 파일 1에는 다음 줄이 있습니다.

ATM 1434.972183
BMPR2 10762.78192
BMPR2 10762.78192
BMPR2 1469.14535
BMPR2 1469.14535
BMPR2 1738.479639
BMS1 4907.841667
BMS1 4907.841667
BMS1 880.4532628
BMS1 880.4532628
BMS1P17 1249.75
BMS1P17 1249.75
BMS1P17 1606.821429
BMS1P17 1606.821429
BMS1P17 1666.333333
BMS1P17 1666.333333
BMS1P17 2108.460317
BMS1P17 2108

파일 2에는 단어 목록이 있습니다.

ATM
BMS1

따라서 출력은 다음과 같습니다.

ATM 1434.972183
BMS1 4907.841667
BMS1 4907.841667
BMS1 880.4532628
BMS1 880.4532628

나는 이것이 실제로 중복된 질문이라는 것을 알고 있지만 모든 유형을 시도했으며 grep아마도 이 작은 예를 통해 여러분에게 도움이 될 것입니다. 그러나 매우 큰 파일이 있고 sed이전 의 모든 방법이 도움이 되지 않았습니다.awk> 1M lines

file 2이 단어를 포함하는 부분 행을 반환합니다. 단, 그 안에 행과 일치하는 다른 단어가 있습니다.file 1

답변1

grep -Fw -f words myfile

myfile그러면 파일의 어느 위치에서나 단어가 포함된 줄이 추출됩니다 words.

words이 옵션으로 인해 의 문자열은 (정규 표현식이 아닌) 고정 문자열로 처리되며 -F-w옵션을 사용하면 정확히 동일한 문자열을 포함하는 행만 얻을 수 있습니다.단어(단어 내 하위 문자열 일치는 허용되지 않습니다.) 단어는 영숫자 및 밑줄 문자 집합의 연속된 문자 시퀀스입니다.

파일에 있는 대부분의 단어는 words별도의 줄에 나열됩니다.

답변2

또 다른 고전적인 옵션은 Awk를 사용하는 것입니다.

$ awk 'NR==FNR {a[$1]++; next} $1 in a' words myfile
ATM 1434.972183
BMS1 4907.841667
BMS1 4907.841667
BMS1 880.4532628
BMS1 880.4532628

이 옵션은 파일 항목의 후행 공백을 구분하지 않습니다 words.

답변3

join다음 명령을 시도해 보세요 .

join file1 file2

ATM 1434.972183
BMS1 4907.841667
BMS1 4907.841667
BMS1 880.4532628
BMS1 880.4532628

관련 정보