Necessito de algoritmo eficiente para retornar todos os dados que não estão em um determinado conjun

1. Necessito de algoritmo eficiente para retornar todos os dados que não estão em um determinado conjun

Mestre Kame
mlgrassi

(usa Debian)

Enviado em 29/11/2017 - 17:47h

Prezados, necessito de uma ajuda para a implementação de um script de batimento de arquivos que NECESSARIAMENTE deve ser em shell.
O cenário é o seguinte. Tendo um arquivo chamado Arquivo_Original.txt, o qual contém informações que serão carregadas/processadas. Este arquivo permanece imutável sempre.
Quando o Arquivo_Original.txt é carregado, será gerado um novo arquivo denominado Arquivo_Processados.txt que conterá os dados que foram processados com sucesso.
Porém, sempre haverá registros que não serão processados e cairão em erro ou exceção, assim sendo precisarei gerar manualmente um arquivo denominado Arquivo_Nao_Processados.txt o qual deverá conter todos os registros que não estão contidos
no Arquivo_Processados.txt, ou seja, preciso montar um script que leia Arquivo_Original.txt e Arquivo_Processados.txt, e retorne todos os registros que estão no arquivo original, porém que não estejam no arquivo de processados.

Exemplo:

Arquivo_Original.txt
0
1
2
3
4
5
6
7
8
9

Arquivo_Processados.txt
3
5
7
8

O script precisará retornar Arquivo_Nao_Processados.txt
0
1
2
4
6
9


OBS1. O comando diff não ajuda em nada neste caso.
OBS2. O algoritmo tem de ser eficiente pois os arquivos que serão processados contém milhões de linhas cada 1.


  


2. MELHOR RESPOSTA

Ryuk Shinigami
Ryuk

(usa Nenhuma)

Enviado em 01/12/2017 - 13:40h

Opção 1:
grep -F -x -v -f processados.txt original.txt 

Opção 2:
awk 'FNR==NR{a[$0]++;next}(!($0 in a))' processados.txt original.txt 

Opção 3:
diff -U $(wc -l < original.txt) original.txt processados.txt | sed -n 's/^-//p' | sed -n '1!p' 

Opção 4:
diff original.txt processados.txt | grep "<" | sed 's/< //' 


3. Re: Necessito de algoritmo eficiente para retornar todos os dados que não estão em um determinado conjun

Mauriciodez
Mauriciodez

(usa Debian)

Enviado em 29/11/2017 - 20:33h

mlgrassi escreveu:

OBS1. O comando diff não ajuda em nada neste caso.


pq não ????

------------------------------------------| Linux User #621728 |-----------------------------------------

" Nem sempre é amigo aquele que te tira do buraco !!! ( Saddam Hussein )"

------------------------------------------| Linux User #621728 |-----------------------------------------



4. Re: Necessito de algoritmo eficiente para retornar todos os dados que não estão em um determinado conjun

Mestre Kame
mlgrassi

(usa Debian)

Enviado em 30/11/2017 - 12:31h

Por que não faz o que deve ser feito, não atende a necessidade.


5. Re: Necessito de algoritmo eficiente para retornar todos os dados que não estão em um determinado co

Paulo
paulo1205

(usa Ubuntu)

Enviado em 30/11/2017 - 17:06h

Os registros do original que estiverem também no processado estarão na mesma ordem, ou podem aparecer em outra ordem? Em ambos os arquivos, esses registros estarão dispostos numa ordem logicamente crescente (ou decrescente, ou obedecendo a uma outra ordem qualquer que seja previsível), ou podem estar aparentemente embaralhados?


6. Re: Necessito de algoritmo eficiente para retornar todos os dados que não estão em um determinado conjun

Mestre Kame
mlgrassi

(usa Debian)

Enviado em 30/11/2017 - 17:19h

Não obedece ordem. Podem sim estar embaralhados. A única coisa que será padrão será a ordem dos dados das colunas, por exemplo Nome Sobrenome Telefone, isso será respeitado seguindo sempre a mesma ordem, porém a ordem das linhas não será alfabético não.


7. Re: Necessito de algoritmo eficiente para retornar todos os dados que não estão em um determinado conjun

Sandro Marcell
SMarcell

(usa Slackware)

Enviado em 01/12/2017 - 10:21h

Veja se o comando "comm" pode ajudar.

$ comm -3 Arquivo_Original.txt Arquivo_Processados.txt
0
1
2
4
6
9



8. Re: Necessito de algoritmo eficiente para retornar todos os dados que não estão em um determinado conjun

Mestre Kame
mlgrassi

(usa Debian)

Enviado em 01/12/2017 - 15:16h

Muitíssimo obrigado, tanto o comm quanto os demais comandos me ajudaram em muito.

Vocês são demais, um grande abraço.


9. Re: Necessito de algoritmo eficiente para retornar todos os dados que não estão em um determinado conjun

Paulo
paulo1205

(usa Ubuntu)

Enviado em 01/12/2017 - 18:44h

Se não tem ordem, é mais difícil, a coisa tende a ficar da ordem de O(n²) (ou O(n·m)), a não ser que você crie um tipo de índice/cache.

Uma ideia: crie um índice do arquivo processado, e depois varra o geral, entrada por entrada, comparando com o índice do que foi processado. Se não achar no índice, então não foi processado. O tempo vai cair de O(n²) para O(n·log n) (ou de O(n·m) para O(n·log m)). Não vai ser um ganho muito grande se n for muito maior que m, no entanto.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts