Remover linhas repetidas com algumas condições

1. Remover linhas repetidas com algumas condições

Carolina Queiroz
carolinaq

(usa Ubuntu)

Enviado em 25/09/2020 - 19:03h

Eu tenho arquivos com 7 colunas. Preciso excluir as linhas em que os valores na primeira, segunda e terceira coluna são iguais. Ou seja, a data (coluna 1), a hora (coluna 2) e o índice (coluna 3) não podem ser repetidos juntos e devo manter apenas a linha em que o valor da sétima coluna é o maior.

Aqui está um exemplo dos dados:

20140101 2100 1762 -5.983 -37.483 26.8 11000
20140101 2100 1762 -5.983 -37.483 36.8 15000
20140109 2040 1762 -5.983 -37.483 25.0 3000
20140109 2040 1762 -5.983 -37.483 28.0 7000
20140130 2250 1762 -5.983 -37.483 22.0 3000
20140109 2040 1763 -5.992 -37.483 25.0 4000
20140109 2040 1763 -5.992 -37.483 23.2 6000
20140114 1940 1763 -5.992 -37.483 34.0 6000


E eu preciso de um resultado como este:

20140101 2100 1762 -5.983 -37.483 36.8 15000
20140109 2040 1762 -5.983 -37.483 28.0 7000
20140130 2250 1762 -5.983 -37.483 22.0 3000
20140109 2040 1763 -5.992 -37.483 23.2 6000
20140114 1940 1763 -5.992 -37.483 34.0 6000


Em outras palavras, as condições são: se você tiver mais de uma linha com a mesma data (por exemplo, 2040101) na coluna 1, a mesma hora (por exemplo, 2100) na coluna 2 e o mesmo índice (por exemplo, 1762 ) na terceira coluna, mantenha apenas a linha em que o valor da última coluna é maior. No caso do exemplo que dei, basta manter:

20140101 2100 1762 -5.983 -37.483 36.8 15000
20140109 2040 1762 -5.983 -37.483 28.0 7000
20140130 2250 1762 -5.983 -37.483 22.0 3000
20140109 2040 1763 -5.992 -37.483 23.2 6000
20140114 1940 1763 -5.992 -37.483 34.0 6000


Obrigada pela ajuda!


  


2. Re: Remover linhas repetidas com algumas condições

leandro peçanha scardua
leandropscardua

(usa Ubuntu)

Enviado em 25/09/2020 - 20:31h

Acho q vc pode ordenar de forma descendente pelas colunas 1,2 e 3 e 7 usando o comando sort e passar o resultado para o awk imprimir a linha quando o valor da coluna 1, 2 e 3 for diferente das respectivas colunas da linha anterior.


3. Re: Remover linhas repetidas com algumas condições

anonymous
rhenrique

(usa XUbuntu)

Enviado em 25/09/2020 - 20:59h

eu ordenei a sua lista pela 7ª coluna em ordem decrescente, e peguei somente as colunas com valores únicos considerando os caracteres até a 18ª coluna, então usei outro sort, agora para ordenar naturalmente pelos primeiros caracteres de forma decrescente, e usei o uniq novamente para isolar somente os não repetidos

sort -k7 -n -r arquivo | uniq -w 18 | sort -r | uniq -w 18



4. Re: Remover linhas repetidas com algumas condições

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 26/09/2020 - 03:53h

carolinaq escreveu:

Eu tenho arquivos com 7 colunas. Preciso excluir as linhas em que os valores na primeira, segunda e terceira coluna são iguais. Ou seja, a data (coluna 1), a hora (coluna 2) e o índice (coluna 3) não podem ser repetidos juntos e devo manter apenas a linha em que o valor da sétima coluna é o maior.

Aqui está um exemplo dos dados:

20140101 2100 1762 -5.983 -37.483 26.8 11000
20140101 2100 1762 -5.983 -37.483 36.8 15000
20140109 2040 1762 -5.983 -37.483 25.0 3000
20140109 2040 1762 -5.983 -37.483 28.0 7000
20140130 2250 1762 -5.983 -37.483 22.0 3000
20140109 2040 1763 -5.992 -37.483 25.0 4000
20140109 2040 1763 -5.992 -37.483 23.2 6000
20140114 1940 1763 -5.992 -37.483 34.0 6000


E eu preciso de um resultado como este:

20140101 2100 1762 -5.983 -37.483 36.8 15000
20140109 2040 1762 -5.983 -37.483 28.0 7000
20140130 2250 1762 -5.983 -37.483 22.0 3000
20140109 2040 1763 -5.992 -37.483 23.2 6000
20140114 1940 1763 -5.992 -37.483 34.0 6000


Em outras palavras, as condições são: se você tiver mais de uma linha com a mesma data (por exemplo, 2040101) na coluna 1, a mesma hora (por exemplo, 2100) na coluna 2 e o mesmo índice (por exemplo, 1762 ) na terceira coluna, mantenha apenas a linha em que o valor da última coluna é maior. No caso do exemplo que dei, basta manter:

20140101 2100 1762 -5.983 -37.483 36.8 15000
20140109 2040 1762 -5.983 -37.483 28.0 7000
20140130 2250 1762 -5.983 -37.483 22.0 3000
20140109 2040 1763 -5.992 -37.483 23.2 6000
20140114 1940 1763 -5.992 -37.483 34.0 6000


Obrigada pela ajuda!

Bom dia Carolinaq.
Segue sugestão:
sort -nr -t" " -k1 -k2 -k3 -k7 dados.txt|uniq --all-repeated=separate -w 18|awk -v file="dados.txt" 'BEGIN{RS="\n\n";FS="\n";} {cmd="sed -i \"/"$2"/d\" " file;system(cmd)}'
cat dados.txt
20140101 2100 1762 -5.983 -37.483 36.8 15000
20140109 2040 1762 -5.983 -37.483 28.0 7000
20140130 2250 1762 -5.983 -37.483 22.0 3000
20140109 2040 1763 -5.992 -37.483 23.2 6000
20140114 1940 1763 -5.992 -37.483 34.0 6000

Antes do awk, temos:
Registro 1
20140109 2040 1763 -5.992 -37.483 23.2 6000 <= Campo 01
20140109 2040 1763 -5.992 -37.483 25.0 4000 <= Campo 02
Registro 2
20140109 2040 1762 -5.983 -37.483 28.0 7000 <= Campo 01
20140109 2040 1762 -5.983 -37.483 25.0 3000 <= Campo 02
Registro 3
20140101 2100 1762 -5.983 -37.483 36.8 15000 <= Campo 01
20140101 2100 1762 -5.983 -37.483 26.8 11000 <= Campo 02
O awk, deleta as linhas referentes ao campo 2 de cada registro, no arq origem.
______________________________________________________________________
Importante: echo -e "\n$(lynx --dump goo.gl/a9KeFc|sed -nr '/^[ ]+Se/,/dou.$/p')\n"
Att.: Marcelo Oliver
______________________________________________________________________






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts