Ordenar string sem delimitador como data [RESOLVIDO]

1. Ordenar string sem delimitador como data [RESOLVIDO]

LUIS FELIPE DE OLIVEIRA RAMOS
xeremzovisck

(usa Ubuntu)

Enviado em 19/03/2020 - 12:02h

Boa tarde,

Eu tenho o seguinte output de um comando

07012020
12032020
23012020
07012020
12032020
23012020
07012020
12032020
23012020

Mesmo ordenando com | sort -u ele não coloca em ordem. Pelo que entendi ele não trata como Data, por isso ordena dessa forma. A ultima linha do output deveria ser 12032020 que é a data mais recente.

eu não consegui chegar a uma solução. Alguem pode ajudar?


  


2. Re: Ordenar string sem delimitador como data

Rogerio
RogerDez

(usa Outra)

Enviado em 19/03/2020 - 12:21h

sed -E 's/^([0-9]{2})([0-9]{2})([0-9]{4})/\3\2\1/'| sort -n | sed -E 's/^([0-9]{4})([0-9]{2})([0-9]{2})/\3\2\1/'  


essa solução com sed, usando expressões regulares extendidas com '-E' para ficar mais fácil de se organizar. com isso, os caracteres )( e }{ serão reconhecidos como expressões regulares.
Usando-se os parênteses (), você pode separar grupos.
com o {}, você pode dizer quantas repetições quer, no caso pedimos uma repetição dos números 0-9 em uma lista, caracterizada por [].

reordenamos a data para AAAAMMDD pq com essa ordenação os números seguirão uma progressão numérica correta. depois desfazemos essa troca para DDMMAAAA de novo.



3. Re: Ordenar string sem delimitador como data [RESOLVIDO]

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 19/03/2020 - 17:14h


xeremzovisck escreveu:

Boa tarde,

Eu tenho o seguinte output de um comando

07012020
12032020
23012020
07012020
12032020
23012020
07012020
12032020
23012020

Mesmo ordenando com | sort -u ele não coloca em ordem. Pelo que entendi ele não trata como Data, por isso ordena dessa forma. A ultima linha do output deveria ser 12032020 que é a data mais recente.

eu não consegui chegar a uma solução. Alguem pode ajudar?

Com o awk.
D1='$5$6$7$8$3$4$1$2'
D2='$7$8$5$6$1$2$3$4'
awk -F '' '{print '$D1'}' num|sort -n|awk -F '' '{print '$D2'}'



______________________________________________________________________
Importante: echo -e "\n$(lynx --dump goo.gl/a9KeFc|sed -nr '/^[ ]+Se/,/dou.$/p')\n"
Att.: Marcelo Oliver
______________________________________________________________________


4. Resolvido

LUIS FELIPE DE OLIVEIRA RAMOS
xeremzovisck

(usa Ubuntu)

Enviado em 20/03/2020 - 15:25h

Galera, Funcionou!

Vocês são show, poderia resumir o que o cada comando fez( a lógica ) para que em uma outra situação eu consiga me safar sem ter que consultar ?

Obrigado


5. Re: Ordenar string sem delimitador como data [RESOLVIDO]

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 20/03/2020 - 17:28h


xeremzovisck escreveu:

Galera, Funcionou!

Vocês são show, poderia resumir o que o cada comando fez( a lógica ) para que em uma outra situação eu consiga me safar sem ter que consultar ?
Obrigado

Boa tarde.
No comando:
D1='$5$6$7$8$3$4$1$2'
D2='$7$8$5$6$1$2$3$4'
awk -F '' '{print '$D1'}' num|sort -n|awk -F '' '{print '$D2'}'
As variáveis são somente para "encurtar" o comando, não são necessárias.
awk -F '' '{print $5$6$7$8$3$4$1$2}' num|sort -n|awk -F '' '{print $7$8$5$6$1$2$3$4}'
É o básico do awk,
Define o separador como "nada" -F "",e,
Altera a ordem dos números,
Ficando "ANOMÊSDIA",
Assim o sort entende como numero e coloca na ordem.
O sed proposto, faz o mesmo.
sed -r 's/(..)(..)(....)/\3\2\1/' <<< "12345678"
56783412
Uma outra forma, mais "complexa", seria converter cada data
para o número de segundos desde 01 01 1970, e, posteriormente aplicar o sort.

______________________________________________________________________
Importante: echo -e "\n$(lynx --dump goo.gl/a9KeFc|sed -nr '/^[ ]+Se/,/dou.$/p')\n"
Att.: Marcelo Oliver
______________________________________________________________________


6. Re: Ordenar string sem delimitador como data

Rogerio
RogerDez

(usa Outra)

Enviado em 21/03/2020 - 12:48h

sed -E 's/^([0-9]{2})([0-9]{2})([0-9]{4})/\3\2\1/'| sort -n | sed -E 's/^([0-9]{4})([0-9]{2})([0-9]{2})/\3\2\1/'   


nessa solução com sed, utilizamos expressões regulares extendidas '-E'.

assim os operadores dos regex serão reconhecidos
[ ] qualifica uma lista de caracteres
( ) qualifica um grupo de um padrão qualquer
{ } quantifica um número de repetições
^ é o começo de uma linha

então no primeiro passo, agrupamos os números AAAMMDD com /^ ( [0-9]{2} ) ( [0-9]{2} ) ( [0-9]{4} ) , onde [0-9] é uma lista com número de zero a nove e pedimos dois números dessa lista com {2}, e delimitamos esse padrão com ( ).. depois com esse mesmo sed ainda, trocamos a ordem dos números para que eles mantenham uma progressão numérica válida quando trabalhamos com datas, ou seja a parte do sed /\3\2\1 , o \3 faz a referência ao terceiro grupo delimitado por ( ) , o \2 ao segundo grupo e \1 ao primeiro grupo.

depois ordenamos com sort -n

e retornamos as datas para formatação original com um outro sed.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts