Como mencionei nos comentários abaixo da pergunta, encontrei uma solução awk
um tanto simples: concatenar os dois números para criar uma cadeia longa, substituir todos os pontos pelo espaço (para permitir o uso do espaço como campo padrão separador no awk), e passar pela string comparando campo com arquivo + meio.
Comando básico
printf ${a[1]}${a[2]} | awk '{gsub("\."," "); half=NF/2}; { for ( x=1; x<=half; x++ ) { if ( $x==$(x + half) ) printf "."$x };}'
Eu testei isso com gawk e mawk, trabalhei em ambos.
Aqui está a saída com o primeiro exemplo (.1.3.6.1.4.1.232.13600256 e .1.3.6.1.4.1.232.13600276):
$ printf ${a[1]}${a[2]} | awk '{gsub("\."," "); half=NF/2}; { for ( x=1; x<=half; x++ ) { if ( $x==$(x + half) ) printf "."$x };}'
.1.3.6.1.4.1.232
Comparações múltiplas
Se você quiser comparar várias strings ao mesmo tempo, concatene-as juntas e separe com newline no printf, então adicione printf no final do comando awk da seguinte forma:
printf "${a[1]}${a[2]}\n${a[3]}${a[4]}" | awk '{gsub("\."," "); half=NF/2}; { for ( x=1; x<=half; x++ ) { if ( $x==$(x + half) ) printf "."$x }; printf "\n"}'
Saída:
$ printf "${a[1]}${a[2]}\n${a[3]}${a[4]}" | awk '{gsub("\."," "); half=NF/2}; { for ( x=1; x<=half; x++ ) { if ( $x==$(x + half) ) printf "."$x }; printf "\n"}'
.1.3.6.1.4.1.232 # same for a[1] and a[2]
.1.3.6.1.4.1.759 # same for a[3] and a[4]
Limitando a saída
Agora, o comentário de kos observou adequadamente que o OP quer que apenas 7 números sejam exibidos. Para esse propósito, você pode adicionar pipe ao comando cut -d'.' -f1-8
. Assim:
printf "${a[5]}${a[6]}" | mawk '{gsub("\."," "); half=NF/2}; { for ( x=1; x<=half; x++ ) { if ( $x==$(x + half) ) printf "."$x }; printf "\n"}' | cut -d'.' -f1-8
Veja o exemplo de saída do meu terminal:
$ a[5]=.1.3.6.1.4.1.232.13600256.885
$ a[6]=.1.3.6.1.4.1.232.13600256.885
$ printf "${a[5]}${a[6]}" | mawk '{gsub("\."," "); half=NF/2}; { for ( x=1; x<=half; x++ ) { if ( $x==$(x + half) ) printf "."$x }; printf "\n"}' | cut -d'.' -f1-8
.1.3.6.1.4.1.232.13600256.885
half) ) printf "."$x }; printf "\n"}' | cut -d'.' -f1-8 <
.1.3.6.1.4.1.232
Simplificando ainda mais
Novamente, tudo pode ser colocado em um script awk
#!/usr/bin/awk -f
{
gsub("\."," ");
half=NF/2
};
{
for ( x=1; x<=half; x++ ) {
if ( $x==$(x + half) ) printf "."$x
};
printf "\n"
}
Execução da amostra:
$ printf "${a[5]}${a[6]}" | num-comp.awk | cut -d'.' -f1-8
.1.3.6.1.4.1.232
Comparação até o primeiro número não igual
O Awk tem uma função muito útil substr(string,X,Y)
que permite cortar ou "cortar" uma string, do primeiro caractere (x) até o final (Y). Então, sabendo disso, vamos pegar os dois números como dois campos de uma string e executá-los através do loop while. Nós vamos continuar aumentando o comprimento da subcadeia (início ao final) até que eles não sejam mais iguais. Quando encontramos as substrings desiguais, fechamos e imprimimos a última substring igual conhecida.
echo ".1.3.6.1.4.1.232.13600256\t.1.3.6.1.4.1.232.13600276" | awk 'BEGIN{i=1}{ while(substr(,1,i)==substr(,1,i)){var=substr(,1,i);i++};} END{print var}'
Agradecimentos especiais a Terdon por sugerir o uso da função substr, que eu nem sabia que existia.