O algoritmo de pesquisa de todo o arquivo 2 para cada linha no arquivo 1 tem um desempenho de tempo de m * n
. Onde m
é a contagem de linhas de arquivo 2 e n
é a contagem de linhas de arquivo 1. Isso se torna muito lento rapidamente.
A solução é primeiro classificar cada arquivo (que é um n * log (n) tempo) e, em seguida, comparar as linhas entre os dois arquivos como este:
- Crie i = 1 (número da linha do arquivo 1) e j = 1 (número da linha do arquivo 2).
- Comparar
a=(file 1)[line i]
com b=(file 2)[line j]
.
-
if a<b;
, em seguida, incrementa i, retorna para 2 (verifique o final do arquivo 1).
-
if a>b;
, em seguida, incrementa j, retorna para 2 (verifique o final do arquivo 2).
-
if a=b;
isto é uma correspondência, imprima, incremente i.
Isso tem um tempo de execução de apenas: n + m
(o tempo para ler todas as linhas).
Todo o processo, então, tem um tempo de execução de: n*log(n) + m*log(m) + n + m
.
Que tem um O (n) de: n * log(n)
para n > m
.
a ordenação é fácil de fazer, basta usar o comando sort
para cada arquivo:
sort -t '|' -k 1 file01.csv > file01-sorted.csv
Em seguida, execute o procedimento acima no awk.
Editar:
Acontece que se todos os 10k números de SPLNO são únicos (sem repetições). E o MDN.TXT também possui registros exclusivos. Em seguida, concatenar os dois arquivos e pesquisar por valores repetidos também fornecerá uma solução. Isso funciona para igualdade simples. Correspondências de regex quebrarão essa ideia na maioria dos casos.