<div dir="ltr">Walmes, obrigado por compartilhar.<div><br><div>Essas comparações de desempenho sempre são boas.</div><div>Eu fiz um curso básico de shell script há um tempo atrás e </div><div>o prof sempre comentava sobre essa característica do shell com arquivos.</div></div><div>Agora eu tenho um exemplo mais prático e com número para exemplificar. <img src="cid:330@goomoji.gmail" goomoji="330" style="margin: 0px 0.2ex; vertical-align: middle;"></div><div><br></div><div><img src="cid:35D@goomoji.gmail" goomoji="35D" style="margin: 0px 0.2ex; vertical-align: middle;">s.<br></div></div><div class="gmail_extra"><br clear="all"><div><div><br></div><div><br></div><div>Atenciosamente,</div><div><br></div>David Feitosa<br><div><div></div></div><div><br></div><div><div>(\_(\</div><div>(=°;°)</div><div>(("")("")</div></div></div>
<br><div class="gmail_quote">Em 24 de outubro de 2014 19:22, walmes . <span dir="ltr"><<a href="mailto:walmeszeviani@gmail.com" target="_blank">walmeszeviani@gmail.com</a>></span> escreveu:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_default" style="font-family:trebuchet ms,sans-serif">Saudações,<br><br></div><div class="gmail_default" style="font-family:trebuchet ms,sans-serif">Essa mensagem é apenas para compartilhar uma experiência que tive e considero que o problema aqui discutido não seja tão particular.<br><br></div><div class="gmail_default" style="font-family:trebuchet ms,sans-serif">Fui procurado por alguém que precisava processar um arquivo com resultados da prova do ENEM 2012 para aplicar teoria de resposta ao item. Precisava-se processar o arquivo original para chegar em um que tivesse apenas 5 das 80 colunas (notas para as competências sobre a redação) e somente às linhas que tivessem o conteúdo "P" (de presente) para a coluna "IN_STATUS_REDACAO". O arquivo é um csv, delimitador vírgula, aspas nas strings, 5791066 de linhas, 3.8 GB. Fiz o que me veio na cabeça de primeira: "dividir para conquistar". Lia porções de 30 mil linhas do arquivo (usando na read.table() o skip= e nrow=), separava as 5 colunas, mantinha só as linhas com registro P e escrevia para um arquivo com write.table(..., append=TRUE). Isso dentro de um for(). Na minha implementação, um tanto ingenua e corrida porque fiz enquanto era assistido a programar, quanto apliquei ao arquivo alvo levou 3h40. Esperava que fosse demorar mas não tanto. Minha máquina tem 16 GB de RAM. Sabendo que o bash do linux é muito eficiente para tarefas como operações em arquivos texto, eu fui buscar na internet como fazer o mesmo. Resultado é que tudo se resolveu com 37 segundos!!! É por isso que achei interessante compartilhar com a lista, inclusive para saber se alguem tem meios alternativos para solucionar o problema. Seguem os comandos que apliquei no terminal do Linux. Os dados fornecidos no exemplo são apenas as 10 mil primeiras linhas do arquivo original.<br><br><span style="font-family:courier new,monospace">##-----------------------------------------------------------------------------<br>## 0. Aquisição dos dados. Apenas 10000 registros dos 5791066 do arquivo<br>## original.<br><br>wget <a href="http://www.leg.ufpr.br/~walmes/data/DADOS_ENEM_2012_10millinhas.csv" target="_blank">http://www.leg.ufpr.br/~walmes/data/DADOS_ENEM_2012_10millinhas.csv</a> -O DADOS_ENEM_2012.csv<br>ls<br>wc -l DADOS_ENEM_2012.csv<br><br>##-----------------------------------------------------------------------------<br>## 1. Filtrar só às colunas de interesse. Da 74 à 79. Na 74 tem-se os<br>## valores P, F e outros.<br><br>cut -d , -f 74-79 DADOS_ENEM_2012.csv > file.csv<br>head -10 file.csv<br>wc -l file.csv<br><br>##-----------------------------------------------------------------------------<br>## 2. Manter só as linhas com ocorrência do P.<br><br>grep "P" file.csv > fileP.csv<br>wc -l fileP.csv<br>head -10 fileP.csv<br><br>##-----------------------------------------------------------------------------<br>## 3. Remover à colunas com P, ou seja, manter da 2 à 6.<br><br>cut -d , -f 2-6 fileP.csv > file.csv<br>head -10 file.csv<br>wc -l file.csv<br><br>##-----------------------------------------------------------------------------<br>## 4. Remover as aspas para salvar espaço em disco.<br><br>sed 's/\"//g' file.csv > fileP.csv<br>head -10 fileP.csv<br><br>##-----------------------------------------------------------------------------<br>## 5. Como contar o número de linhas repetidas. Gerar tabela de frequência dos<br>## padrões de resposta. Economiza espaço e é a informação mínima<br>## necessária para ajustar TRI. Remover o cabeçalho.<br><br>sed 1d fileP.csv > file.csv<br>sort file.csv | uniq --count > fileP.csv<br>head -10 fileP.csv<br>tail -10 fileP.csv<br><br>##-----------------------------------------------------------------------------<br>## 6. Eliminar espaços no ínicio e colocar uma vírgula entre a<br>## frequência e o primeiro registro para que todos os campos sejam<br>## separados por `,`.<br><br>sed -e 's/^ *//;s/ /,/' fileP.csv > fileFreq.csv<br>head -10 fileFreq.csv<br>wc -l fileFreq.csv<br><br>##-----------------------------------------------------------------------------<br></span><br>À disposição.<br>Walmes.<br></div><div class="gmail_default" style="font-family:trebuchet ms,sans-serif"><br clear="all"></div><div><div dir="ltr"><span style="font-family:trebuchet ms,sans-serif">==========================================================================</span><br style="font-family:trebuchet ms,sans-serif"><span style="font-family:trebuchet ms,sans-serif">Walmes Marques Zeviani</span><br style="font-family:trebuchet ms,sans-serif"><span style="font-family:trebuchet ms,sans-serif">LEG (Laboratório de Estatística e Geoinformação, 25.450418 S, 49.231759 W)</span><br style="font-family:trebuchet ms,sans-serif"><span style="font-family:trebuchet ms,sans-serif">Departamento de Estatística - Universidade Federal do Paraná</span><br style="font-family:trebuchet ms,sans-serif"><span style="font-family:trebuchet ms,sans-serif">fone: <a href="tel:%28%2B55%29%2041%203361%203573" value="+554133613573" target="_blank">(+55) 41 3361 3573</a></span><br style="font-family:trebuchet ms,sans-serif"><span style="font-family:trebuchet ms,sans-serif">skype: walmeszeviani<br style="font-family:trebuchet ms,sans-serif"></span><span style="font-family:trebuchet ms,sans-serif">homepage: <a href="http://www.leg.ufpr.br/%7Ewalmes" target="_blank">http://www.leg.ufpr.br/~walmes</a></span><br style="font-family:trebuchet ms,sans-serif"><span style="font-family:trebuchet ms,sans-serif">linux user number: 531218</span><br style="font-family:trebuchet ms,sans-serif"><span style="font-family:trebuchet ms,sans-serif">==========================================================================</span></div></div>
</div>
<br>_______________________________________________<br>
R-br mailing list<br>
<a href="mailto:R-br@listas.c3sl.ufpr.br">R-br@listas.c3sl.ufpr.br</a><br>
<a href="https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br" target="_blank">https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br</a><br>
Leia o guia de postagem (<a href="http://www.leg.ufpr.br/r-br-guia" target="_blank">http://www.leg.ufpr.br/r-br-guia</a>) e forneça código mínimo reproduzível.<br></blockquote></div><br></div>