Retirar duplicadas

1. Retirar duplicadas

Francine Oliveira
fran_bi_pro

(usa Red Hat)

Enviado em 25/09/2023 - 18:48h

Boa noite a todos!

Tenho um arquivo com vários registros e entre as colunas 3 e 8 contém valores iguais em várias linhas no qual preciso retirá-las.
Exemplo:

E112345678.....(LINHA1)
E412345678.....(LINHA2)
E512345678.....(LINHA3)

Observe que na posição 3 até 8 temos valores iguais, neste caso, o valor '12345678'. Então ao invés de ter 3 linhas para este valor, preciso deixar somente uma linha.

Alguém poderia me ajudar?




  


2. Re: Retirar duplicadas

Alexa Bolada
alexabolada

(usa Debian)

Enviado em 25/09/2023 - 18:48h

Olá!

Você pode usar o comando awk para resolver este problema.

Segue abaixo o comando:

awk '!a[substr($0,3,8)]++' nome_do_arquivo > novo_arquivo

Explicação:

Isso é feito usando uma matriz associativa em awk. A função substr extrai a substring da 3ª posição até a 8ª posição. A matriz associativa 'a' é usada para verificar se essa substring já apareceu antes.

Se a substring já apareceu antes, então 'a[substr($0,3,8)]' retornará um valor verdadeiro (maior que 0) e a linha não será impressa.

Se essa substring não tiver aparecido ainda, então 'a[substr($0,3,8)]++' retornará falso (0) e a linha será impressa.

O sinal '>' é usado para redirecionar a saída do comando awk para um novo arquivo. Então todas as linhas sem duplicatas serão salvas em 'novo_arquivo'.

Você precisa ter permissão de leitura no arquivo original e permissão de escrita no diretório em que está o novo arquivo para executar este comando. Como este comando não necessita de permissões de administrador (root), utilizamos o sinal $.

Import


3. Re: Retirar duplicadas

Francine Oliveira
fran_bi_pro

(usa Red Hat)

Enviado em 25/09/2023 - 20:10h


@alexabolada,boa noite!

Obrigada por responder a este tópico.
Ainda não foram retirada todas linhas onde os valores da coluna 3 ao 8 são duplicadas.

Confesso que retiraram várias linhas, mas ainda, não todas.

OBS: Além da coluna 8 existem caracteres.


4. Re: Retirar duplicadas

Alexa Bolada
alexabolada

(usa Debian)

Enviado em 25/09/2023 - 20:10h

Olá!

Revisando seu problema, parece que você está tentando remover linhas duplicadas com base em colunas específicas em um arquivo. Sem saber exatamente o formato do seu arquivo, aqui está um exemplo geral de como você pode fazer isso usando o comando awk no terminal Linux.

Você pode criar um script awk que verifica a duplicidade das colunas 3 a 8. O script efetivamente irá pular qualquer linha que já tenha sido vista antes. Aqui está uma maneira de fazer isso:


$ awk '!seen[$3, $4, $5, $6, $7, $8]++' nome_do_seu_arquivo


Este comando irá imprimir as linhas do arquivo onde as colunas de 3 a 8 são únicas.

Porém observe que este comando não irá modificar o arquivo original. Caso queira gravar o resultado em um novo arquivo, utilize o seguinte comando:


$ awk '!seen[$3, $4, $5, $6, $7, $8]++' nome_do_seu_arquivo > novo_arquivo


Espero que isso lhe ajude a solucionar o problema.

Atenciosamente,
Alexa Bolada.


5. Re: Retirar duplicadas

Francine Oliveira
fran_bi_pro

(usa Red Hat)

Enviado em 25/09/2023 - 20:45h


Alexa,

O arquivo é do tipo .txt com 1001 posições.

Ex. de duas linhas.
Ainda constam essas duas linhas após a passagem do primeiro comando que me informou.

E22000410237PPTBasico(34espacos)0F0..........até a posição 1001 com demais valores.
E22000410005PPWBasico(34espacos)1F0.......

O segundo comando que me passou, tirou linhas que não tinham valores repetidos.rsrs

Obrigada pela ajuda mais uma vez.

Fran




6. Re: Retirar duplicadas

Francine Oliveira
fran_bi_pro

(usa Red Hat)

Enviado em 25/09/2023 - 20:58h

Alexa,

Devo ter falhado ao falar coluna, melhor ter escrito, posição 3 à posição 8 da linha.

Melhora assim?

Att.
Fran



7. Re: Retirar duplicadas

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 25/09/2023 - 22:19h

fran_bi_pro escreveu:

Boa noite a todos!

Tenho um arquivo com vários registros e entre as colunas 3 e 8 contém valores iguais em várias linhas no qual preciso retirá-las.
Exemplo:

E112345678.....(LINHA1)
E412345678.....(LINHA2)
E512345678.....(LINHA3)

Observe que na posição 3 até 8 temos valores iguais, neste caso, o valor '12345678'. Então ao invés de ter 3 linhas para este valor, preciso deixar somente uma linha.

Alguém poderia me ajudar?


Boa noite Fran.
Segue sugestão:

cat linhas.txt
E112345678PPTBasico7f9f2bc5577c8d4ac39d2967b677df964f7e51e733b4175d381
E287654321PPUBasico58f0a0532c1673e90364de45bcb0d4cf4474ca8c81d7b40c912
E312345678PPVBasico05c16a3f15752004586f740f5470230d5344e68c137ed389f63
E498765432PPWBasico071553f638ebac7c6c598c5c0d56702027827ef19f8cf0dd4e4
E512345678PPXBasicoe613cf76b40f2e999fb8a200e20fac2f146287f7eda59403d55
E601234567PPYBasico67e564e80d93ccf8a36bda8e0a24435c858d3d35582c295ca06
E712345678PPZBasico6420dbc98a8a312028648cd4aad47ca0d86a771e96e1844f1d7
E812345678PPzBasico67e564e80d93ccf8a36bda8e0a24435c858d3d35582c295ca08

gawk 'BEGIN{FIELDWIDTHS="2 8"} {if(! ($2 in rep)){print $0;rep[$2]++;}}' linhas.txt
E112345678PPTBasico7f9f2bc5577c8d4ac39d2967b677df964f7e51e733b4175d381
E287654321PPUBasico58f0a0532c1673e90364de45bcb0d4cf4474ca8c81d7b40c912
E498765432PPXBasico071553f638ebac7c6c598c5c0d56702027827ef19f8cf0dd4e4
E601234567PPXBasico67e564e80d93ccf8a36bda8e0a24435c858d3d35582c295ca06



FIELDWIDTHS="2 8" => define campo 01 para 2 caracteres e campo 02 para 8 caracteres.
if(! ($2 in rep)) => Se, campo 2 não esta em "rep"
{print $0; => imprime a linha inteira
rep[$2]++; => acrescenta na matriz rep
}}

Linhas com '12345678'.
grep -n '12345678' linhas.txt
1:E112345678PPTBasico7f9f2bc5577c8d4ac39d2967b677df964f7e51e733b4175d381
3:E312345678PPVBasico05c16a3f15752004586f740f5470230d5344e68c137ed389f63
5:E512345678PPWBasicoe613cf76b40f2e999fb8a200e20fac2f146287f7eda59403d55
7:E712345678PPYBasico6420dbc98a8a312028648cd4aad47ca0d86a771e96e1844f1d7
8:E812345678PPZBasico67e564e80d93ccf8a36bda8e0a24435c858d3d35582c295ca08


printa só a linha 1
gawk 'BEGIN{FIELDWIDTHS="2 8"} {if(! ($2 in rep)){print NR,$0;rep[$2]++;}}' linhas.txt
1 E112345678PPTBasico7f9f2bc5577c8d4ac39d2967b677df964f7e51e733b4175d381
2 E287654321PPUBasico58f0a0532c1673e90364de45bcb0d4cf4474ca8c81d7b40c912
4 E498765432PPXBasico071553f638ebac7c6c598c5c0d56702027827ef19f8cf0dd4e4
6 E601234567PPXBasico67e564e80d93ccf8a36bda8e0a24435c858d3d35582c295ca06

É isso, espero que resolva o seu problema....

______________________________________________________________________
Importante:
lynx --dump https://www.vivaolinux.com.br/termos-de-uso/ | sed -nr '/^[ ]+Se/,/dou.$/p'
______________________________________________________________________
Nota de esclarecimento:
O comando: ACIMA, faz parte da minha assinatura.
Att.: Marcelo Oliver
______________________________________________________________________







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts