<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">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: (+55) 41 3361 3573</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>