내 파일 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