Como posso capturar os caracteres comuns entre duas cadeias de caracteres

0

Estou procurando comparar duas strings e capturar a parte comum, por exemplo

  • FILE0000010985.LOG
  • FILE0000010999.LOG
  • FILE0000011000.LOG

If I compare 1 to 2, I want the output to be FILE00000109, but if I compare 1 to 3, the output would be 2 characters less FILE000001

Ele está capturando o prefixo comum, suponho, mas as sequências são desconhecidas para mim, por isso não é tão simples quanto usar os recursos de correspondência de substring do Bash, etc.

    
por HuggieRich 05.03.2015 / 12:42

3 respostas

1

Solução pura de bash. Observe que a saída para 1 e 2 é FILE00000109, não FILE0000010.

#!/bin/bash
arr=(FILE0000010985.LOG
     FILE0000010999.LOG
     FILE0000011000.LOG
    )
for (( i=0; i<${#arr[@]}; ++i )) ; do
    for (( j=i + 1; j<${#arr[@]}; ++j )) ; do
        x=${arr[i]}
        y=${arr[j]}
        p=0
        while [[ ${x:0:p} == ${y:0:p} ]] ; do 
            (( ++p ))
        done
        echo $x $y : ${x:0:p-1}
    done
done
    
por 05.03.2015 / 13:09
0

Para comparar cada linha com a anterior, começando da segunda:

awk '
    NR==1{
        split($0,U,"")
        next}
    {
        s=split($0,A,"")
        f=1
        if(length(U)>s)
            s=length(U)
        for(i=1;i<=s;i++)
            if(A[i]==U[i]&&f!=0)
                printf("%s",A[i])
            else {
                f=0
                U[i]=A[i]}
        print ""}
'
    
por 05.03.2015 / 13:46
0

Se os dois arquivos forem diferentes, uma possibilidade é

f1=FILE0000010985.LOG
f2=FILE0000010999.LOG

for ((l=0; l<${#f1}; l++))
do [[ ${f1:0:l} != "${f2:0:l}" ]] && break
done
printf "%s\n" "${f1:0:l-1}"

(Se os arquivos forem iguais, um teste adicional deve ser adicionado).

    
por 05.03.2015 / 13:14