두 개의 서로 다른 문장에 두 개의 문자열이 있습니다.
문자열 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로 바꾸고$str1
stdout으로 인쇄한 다음 입력 파일을 정렬해야 할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