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
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts