Eu uso muita classificação grep awk no meu shell unix para trabalhar com arquivos de texto de coluna separados por tabulação de tamanho médio (em torno de 10M a 100M linhas). A esse respeito, o shell unix é minha planilha.
Mas eu tenho um grande problema, que é selecionar registros com uma lista de IDs.
Tendo table.csv
arquivo com formato id\tfoo\tbar...
e ids.csv
arquivo com lista de IDs, selecione apenas os registros table.csv
com ID presente em ids.csv
.
tipo /programming/13732295/extract-all-lines-from-text-file-based-on-a-given-list-of-ids mas com shell, não perl.
grep -F
obviamente produz falsos positivos se os IDs tiverem largura variável.
join
é um utilitário que eu nunca consegui descobrir. Antes de tudo, requer classificação alfabética (meus arquivos geralmente são numerados), mas mesmo assim não consigo fazê-lo funcionar sem reclamar de ordem incorreta e pular alguns registros. Então eu não gosto disso. grep -f no arquivo com ^id\t
-s é muito lento quando o número de IDs é grande.
awk
é complicado.
Existem boas soluções para isso? Alguma ferramenta específica para arquivos separados por tabulação? Funcionalidades extras também serão bem-vindas.
UPD: corrigido sort
->join
awk
.
sort
pode fazer todos os tipos de classificação, numéricos, alfabéticos e outros. Veja man sort
.
grep -f
for muito lento, manter essa estratégia parecerá mais problemático do que vale a pena - as variações provavelmente serão afetadas pelos mesmos problemas de desempenho O (N * M). Talvez o seu tempo seria melhor gasto aprendendo a usar um normalizada SQL DB ...