파일 B의 모든 문구에 대해 파일 A를 grep하고 싶습니다. 여기서 문구는 길이가 X인 단어 문자열입니다. 이상적으로는 agrep과 마찬가지로 grep과 유사합니다. 명령줄 도구를 사용하여 이를 수행할 수 있는 방법이 있습니까?
답변1
를 사용하여 zsh
다음을 시도해 볼 수 있습니다.
x=3
B_words=($(<B))
A_words=($(<A))
A="$A_words"
setopt extendedglob
for ((i = 1; i<=$#B_words - x + 1; i++)) {
phrase=$B_words[i,i+x-1]
[[ " $A " = (#a2)*" $phrase "* ]] && printf '%s\n' $phrase
}
그러면 파일 A에도 있는 파일 B의 3개 단어 시퀀스가 제공됩니다(2개의 오류 허용 (#a2)
).
예를 들어, A
귀하의 질문이 B
위의 문장이라면 다음과 같은 결과를 얻습니다.
of 3 words
3 words of
in file A
또는 파일에 어떤 일치 항목이 있는지 확인하려면 다음을 수행하세요 A
.
for ((i = 1; i<=$#B_words - x + 1; i++)) {
phrase=$B_words[i,i+x-1]
[[ " $A " = (#a2)(#b)*" "($phrase)" "* ]] &&
printf '%s\n' "$phrase ($match[1])"
}
이것은 만든다:
of 3 words (of words)
3 words of (words of)
in file A (in file B,)
성격여기에서 비IFS 문자 시퀀스로 정의된 기본값 $IFS는 공백, 탭, 줄 바꿈 및 nul을 제외한 모든 문자입니다.
답변2
전체 행에 관심이 있는 한 diff를 사용할 수 있습니다.
diff file1 file2 --old-line-format='' --new-line-format='' --unchanged-line-format='%L'
old-line-format
첫 번째 파일의 행만 참조 하며 생략하려면 공백으로 포맷합니다.
new-line-format
두 번째 파일의 행만 참조 하며, 생략하려면 공백으로 포맷합니다.
줄 바꿈을 포함하여 줄을 인쇄하는 unchanged-line-format
형식으로 두 파일의 줄을 인용합니다 .'%L'
diff 출력 형식에 대한 자세한 내용은 여기에서 확인할 수 있습니다.http://www.gnu.org/software/diffutils/manual/html_node/Line-Formats.html
답변3
쉽습니다. cat A | grep -f B
Patterna나 간단한 bash 스크립트를 실행하면 됩니다.
#!/bin/bash
IFS=' ' read -ra ADDR <<< $(cat "$1")
read -ra ADDR2 <<< $(cat "$2")
for i in "${ADDR[@]}"; do
for n in "${ADDR2[@]}"; do
if [[ "$i" -eq "$n" ]]; then
echo $n
fi
done
done
파일을 인수로 사용하여 실행하십시오../scritp.sh A B