a.txt
두 개의 파일이 있고 그 안에 있는 모든 단어를 b.txt
찾고 싶다고 가정해 보겠습니다 .a.txt
b.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 -u
tr
출력을 정렬하고 중복 항목을 제거합니다.
프로세스 대체 <(...)
는 명령 출력 tr|sort
을 comm
.
그리고 zsh
:
w1=($(<a.txt)) w2=($(<b.txt))
print -rl -- ${(u)${w1:*w2}}
거기,단어공백, 탭, nul 및 줄 바꿈 이외의 문자 시퀀스입니다(기본값은 $IFS
).
$(<a.txt)
$(cat a.txt)
zsh
where 를 호출하지 않고 파일 내용 자체를 읽을 수 있는 최적화된 버전입니다 cat
. 인용되지 않기 때문에 단어 분할을 수행합니다(그러나 다른 쉘과 달리 와일드카드를 수행하지 않습니다).
따라서 sum은 합계의 모든 단어를 w1
포함하는 배열입니다 .w2
a.txt
b.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 파일을 비교하여 공통 라인만 출력합니다.