두 파일을 서로 grep할 수 있나요?

두 파일을 서로 grep할 수 있나요?

파일 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 BPatterna나 간단한 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

관련 정보