{"id":258,"date":"2022-04-09T11:48:21","date_gmt":"2022-04-09T14:48:21","guid":{"rendered":"https:\/\/guineves.com.br\/wp\/?p=258"},"modified":"2022-04-09T11:48:53","modified_gmt":"2022-04-09T14:48:53","slug":"contar-ocorrencias-e-ordenar-listas","status":"publish","type":"post","link":"https:\/\/guineves.com.br\/wp\/?p=258","title":{"rendered":"Contar ocorr\u00eancias e ordenar listas"},"content":{"rendered":"\n<p>Mais uma vez, um tipo de coleta que me vejo frequentemente fazendo e venho compartilhar com voc\u00ea.<\/p>\n\n\n\n<p>Nessa dica, irei mostrar como podemos usar um conjunto de comandos para agregar quantidades e nos mostrar uma lista ordenada.<\/p>\n\n\n\n<p>Vamos supor que temos o arquivo de log abaixo, j\u00e1 filtrado com o conte\u00fado de interesse:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>2022-04-09 10:00:01 String interessante\n2022-04-09 10:00:15 String interessante\n2022-04-09 10:00:30 String interessante\n2022-04-09 10:01:01 String interessante\n2022-04-09 10:01:12 String interessante\n2022-04-09 10:01:30 String interessante\n2022-04-09 10:01:45 String interessante\n2022-04-09 10:01:50 String interessante\n2022-04-09 10:02:07 String interessante\n2022-04-09 10:02:18 String interessante\n2022-04-09 10:02:23 String interessante\n2022-04-09 10:02:42 String interessante\n2022-04-09 10:02:48 String interessante\n2022-04-09 10:02:55 String interessante\n2022-04-09 10:03:08 String interessante\n2022-04-09 10:03:16 String interessante\n2022-04-09 10:03:32 String interessante\n2022-04-09 10:03:44 String interessante\n2022-04-09 10:04:25 String interessante<\/code><\/pre>\n\n\n\n<p> Uma informa\u00e7\u00e3o importante que eu quero nesse caso \u00e9 saber quantas vezes por minuto a &#8220;String interessante&#8221; apareceu.<\/p>\n\n\n\n<p>Para isso, primeiro vamos verificar como obter apenas o hor\u00e1rio do log, utilizando o comando awk.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ awk '{print $2}' log.out<\/code><\/pre>\n\n\n\n<p>O separador padr\u00e3o do awk \u00e9 o espa\u00e7o, por isso n\u00e3o foi necess\u00e1rio informar no comando.<\/p>\n\n\n\n<p>A sa\u00edda desse comando \u00e9 a seguinte.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>10:00:01\n10:00:15\n10:00:30\n10:01:01\n10:01:12\n10:01:30\n10:01:45\n10:01:50\n10:02:07\n10:02:18\n10:02:23\n10:02:42\n10:02:48\n10:02:55\n10:03:08\n10:03:16\n10:03:32\n10:03:44\n10:04:25<\/code><\/pre>\n\n\n\n<p>Em seguida, queremos isolar somente os campos de hora e minuto, poderia fazer isso com o awk tamb\u00e9m, mas para variar um pouco, irei utilizar o comando cut.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ awk '{print $2}' log.out | cut -d ':' -f 1,2<\/code><\/pre>\n\n\n\n<p>No comando acima, estamos passando a sa\u00edda do primeiro comando (awk) para o segundo comando (cut) com o aux\u00edlio do direcionador pipe (|).<br>Para o cut, estou informando o delimitador &#8216;:&#8217; e informando que quero os seguintes campos, 1 e 2.<\/p>\n\n\n\n<p>Sa\u00edda do comando, at\u00e9 o momento<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>10:00\n10:00\n10:00\n10:01\n10:01\n10:01\n10:01\n10:01\n10:02\n10:02\n10:02\n10:02\n10:02\n10:02\n10:03\n10:03\n10:03\n10:03\n10:04<\/code><\/pre>\n\n\n\n<p>O que queremos agora \u00e9 agregar as linhas e contar quantas ocorr\u00eancias temos para cada conjunto de hora:minuto.<\/p>\n\n\n\n<p>Vale uma observa\u00e7\u00e3o aqui: <br>Para usar o comando uniq precisamos que a lista esteja ordenada e, nesse caso por conta da natureza do log, isso j\u00e1 acontece.<br>Para todos os efeitos, irei ordenar a lista de qualquer forma, com o comando sort.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ awk '{print $2}' log.out | cut -d ':' -f 1,2 | sort | uniq -c<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>3 10:00\n5 10:01\n6 10:02\n4 10:03\n1 10:04<\/code><\/pre>\n\n\n\n<p>E por fim, podemos ordenar essa lista do menor para o maior, utilizando novamente o comando sort<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ awk '{print $2}' log.out | cut -d ':' -f 1,2 | sort | uniq -c | sort -n<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>       1 10:04\n       3 10:00\n       4 10:03\n       5 10:01\n       6 10:02<\/code><\/pre>\n\n\n\n<p>Caso queira inverter a lista, basta utilizar o argumento -r no \u00faltimo sort<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ awk '{print $2}' log.out | cut -d ':' -f 1,2 | sort | uniq -c | sort -nr<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>       6 10:02\n       5 10:01\n       4 10:03\n       3 10:00\n       1 10:04<\/code><\/pre>\n\n\n\n<p>Espero que essa dica tenha sido esclarecedora e principalmente que lhe seja \u00fatil!<\/p>\n\n\n\n<p>At\u00e9 a pr\u00f3xima!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Vamos gerar informa\u00e7\u00e3o com a ajuda do awk, cut, sort e uniq encadeados \ud83d\ude00<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6],"tags":[],"class_list":["post-258","post","type-post","status-publish","format-standard","hentry","category-dicas"],"_links":{"self":[{"href":"https:\/\/guineves.com.br\/wp\/index.php?rest_route=\/wp\/v2\/posts\/258","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/guineves.com.br\/wp\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/guineves.com.br\/wp\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/guineves.com.br\/wp\/index.php?rest_route=\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/guineves.com.br\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=258"}],"version-history":[{"count":6,"href":"https:\/\/guineves.com.br\/wp\/index.php?rest_route=\/wp\/v2\/posts\/258\/revisions"}],"predecessor-version":[{"id":264,"href":"https:\/\/guineves.com.br\/wp\/index.php?rest_route=\/wp\/v2\/posts\/258\/revisions\/264"}],"wp:attachment":[{"href":"https:\/\/guineves.com.br\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=258"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/guineves.com.br\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=258"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/guineves.com.br\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=258"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}