두 문자열 간의 유사성을 추출하는 방법

두 문자열 간의 유사성을 추출하는 방법

두 개의 서로 다른 문장에 두 개의 문자열이 있습니다.

문자열 1:30 mutation alanine for valine

문자열 2:alanine at position 30

예를 들어 정규식을 사용하여 둘 다 30과 알라닌을 가지고 있기 때문에 둘 사이의 유사점을 찾을 수 있는 방법이 있습니까?

답변1

당신이 할 수 있는 한 가지는 두 문자열 모두에서 단어가 나타나는지 확인하는 것입니다.

$ comm -12 <(sed 's/ /\n/g' <<<$str1 | sort) <(sed 's/ /\n/g' <<<$str2 | sort )
30
alanine

설명하다

  • 파일을 비교하십시오 comm command. -1및 플래그를 사용하면 -2다음에서 찾은 줄을 인쇄합니다.둘 다문서.

  • sed 's/ /\n/g' <<<$str1 | sort: 이는 단순히 모든 공백을 newlines로 바꾸고 $str1stdout으로 인쇄한 다음 입력 파일을 정렬해야 할 sort때 stdout을 전달합니다. comm형식에 대한 자세한 내용은 <<<$var다음을 참조하세요.Bash: 여기에 문자열을 입력하세요.

  • <(command)형식을 프로세스 대체라고 합니다. 이에 대한 자세한 내용은여기.

위 명령의 최종 결과는 두 문자열 모두에 나타나는 모든 단어의 목록이 됩니다.

답변2

어쩌면 wdiff그것이 당신에게 도움이 될 수 있을까요? 문자열을 두 개의 파일에 넣고 다음과 결합합니다 wdiff.

echo "30 mutation alanine for valine" > file1
echo "alanine at position 30" > file2
wdiff -t file1 file2

출력 스크린샷:

출력 스크린샷

답변3

당신이하고있는 일이 약간 복잡하기 때문에 일반적인 정규식을 사용하여 수행하는 방법을 생각할 수 없습니다.

같은 언어를 사용하다루비당신은 할 수나뉘다정규식( )을 통해 문자열을 공백으로 구분된 단어 배열로 변환 \s+하고교차로&( ) 두 결과 배열 중.

"30 mutation alanine for valine".split( /\s+/ ) & "alanine at position 30".split( /\s+/ )
=> ["30", "alanine"]

공백은 실제로 Ruby에서 분할의 기본값이므로 다음과 같이 단축할 수 있습니다.

"30 mutation alanine for valine".split & "alanine at position 30".split

답변4

해결책 은 다음과 같습니다 awk.

$ awk '{for(i=1;i<=NF;i++){a[$i]++}}
    END {
        for(i in a) {
            if(a[i] > 1) {
                print i
            }
        }
    }' file1 file2
30
alanine

관련 정보