다른 텍스트 파일에 나타나는 한 텍스트 파일의 모든 단어 찾기

다른 텍스트 파일에 나타나는 한 텍스트 파일의 모든 단어 찾기

a.txt두 개의 파일이 있고 그 안에 있는 모든 단어를 b.txt찾고 싶다고 가정해 보겠습니다 .a.txtb.txt

이를 수행하는 특정 명령이 있습니까?

답변1

bash및 다음 을 사용하는 zsh일부 구현 ksh:

comm -12 <(tr -s '[:space:]' '[\n*]' < a.txt | sort -u) \
         <(tr -s '[:space:]' '[\n*]' < b.txt | sort -u)

거기,단어공백이 아닌 문자의 시퀀스입니다(GNU의 경우 tr다중 바이트 공백 문자에서는 작동하지 않습니다).

comm두 개의 정렬된 파일 사이의 공통 줄을 찾습니다. 옵션이 없으면 3개의 열(file1에만 있는 줄, file2에만 있는 줄, 둘 다에 공통되는 줄)이 인쇄됩니다. 출력에서 해당 열을 제거하려면 -1, -2를 추가합니다 . -3따라서 comm -12세 번째 열(공통선)만 남습니다.

tr -s '[:space:]' '[\n*]' 어떤 병음이든에스클래스 문자 시퀀스는 space각각을 래핑합니다.단어자체 라인에서.

sort -utr출력을 정렬하고 중복 항목을 제거합니다.

프로세스 대체 <(...)는 명령 출력 tr|sortcomm.


그리고 zsh:

w1=($(<a.txt)) w2=($(<b.txt))
print -rl -- ${(u)${w1:*w2}}

거기,단어공백, 탭, nul 및 줄 바꿈 이외의 문자 시퀀스입니다(기본값은 $IFS).

$(<a.txt)$(cat a.txt)zshwhere 를 호출하지 않고 파일 내용 자체를 읽을 수 있는 최적화된 버전입니다 cat. 인용되지 않기 때문에 단어 분할을 수행합니다(그러나 다른 쉘과 달리 와일드카드를 수행하지 않습니다).

따라서 sum은 합계의 모든 단어를 w1포함하는 배열입니다 .w2a.txtb.txt

${w1:*w2}두 배열(두 배열에 공통된 요소)의 교차점을 제공하는 zsh 연산자입니다. (u)고유 요소를 유지(중복 제거)하는 매개변수 확장 플래그입니다.

print -rl각 인수를 한 줄에 하나씩 인쇄합니다.

답변2

# Create dummy text file containing two words
$ echo -e "overflow\ngrep" > b
# Search in file for lines containing one word from file b
$ grep --color --fixed-strings --file b /usr/share/dict/words

내 시스템의 결과:

overflow
overflow's
overflowed
overflowing
overflows

다음에 추가--일치만(-o) 인수는 해당 단어가 나오는 전체 줄이 아닌 단어만 가져옵니다.

답변3

파일의 단어가 LF로 구분되어 있고 단어가 "nice" 문자로만 구성되어 있으며 b.txt에 마지막 LF가 없다고 가정하면 다음과 같습니다.

egrep `tr '\n' '|' < b.txt` a.txt

성공할 수도 있습니다.

답변4

단어 수준에서는 작동하지 않지만 줄 수준에서는 더 많이 작동하지만 이는 귀하 또는 답변을 찾는 다른 사람들에게 유용할 수 있습니다.

diff --left-column --from-file=a.txt --to-file=b.txt

a.txt 파일과 b.txt 파일을 비교하여 공통 라인만 출력합니다.

관련 정보