Como extrair as semelhanças entre duas cadeias de caracteres

2

Eu tenho duas strings em duas frases diferentes:

string 1: 30 mutation alanine for valine

string 2: alanine at position 30

está lá para encontrar as semelhanças entre eles, como é claro ambos têm 30 e alanina usando expressões regulares, por exemplo?

    
por nlp 30.04.2014 / 12:23

4 respostas

4

Uma coisa que você pode fazer é verificar as palavras que aparecem nas duas strings:

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

Explicação

  • O comm command compara arquivos. Com os sinalizadores -1 e -2 , ele imprimirá as linhas encontradas em ambos arquivos.

  • sed 's/ /\n/g' <<<$str1 | sort : Isso simplesmente substitui todos os espaços por novas linhas em $str1 , imprimindo na saída padrão, que é então passada por sort porque comm precisa que seus arquivos de entrada sejam classificados. Para mais informações sobre o formato <<<$var , consulte Bash: Here Strings .

  • O formato <(command) é chamado de substituição de processo, mais sobre aqui .

O resultado final do comando acima será uma lista de todas as palavras que aparecem em ambas as strings.

    
por 30.04.2014 / 12:57
3

Talvez wdiff possa ajudar você? Coloque as strings em dois arquivos e compare-os com wdiff :

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

Captura de tela da saída:

    
por 30.04.2014 / 13:00
1

Não consigo pensar em uma maneira com o regex simples, pois o que você está fazendo é um pouco complexo.

Em uma linguagem como Ruby , você pode divide as strings em uma matriz de palavras delimitadas por espaço via regex ( \s+ ) e obtém o intersection ( & ) das duas matrizes resultantes.

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

O espaço em branco é, na verdade, o padrão para dividir em Ruby, portanto, isso pode ser encurtado para

"30 mutation alanine for valine".split & "alanine at position 30".split
    
por 30.04.2014 / 12:57
0

Aqui está uma solução 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
    
por 30.04.2014 / 18:34