Analisei as respostas neste tópico útil , mas meu problema parece ser diferente o suficiente para que eu não consiga pensar em uma boa resposta (pelo menos com sed
).
Eu tenho um arquivo CSV grande (mais de 200 GB) com linhas parecidas com a seguinte:
<alphanumerical_identifier>,<number>
onde <alphanumerical_identifier>
é único em todo o arquivo. Eu gostaria de criar um arquivo separado que substitua a primeira coluna por um índice , ou seja,
<index>,<number>
para que possamos obter:
1, <number>
2, <number>
3, <number>
Pode awk
gerar um índice crescente sem carregar o arquivo completo na memória?
Como o índice aumenta monotonicamente, pode ser ainda melhor simplesmente descartá-lo. A solução para isso seria tão diferente ?, ou seja:
<number>
<number>
<number>
awk -F, '{print ++n, $2}'
funcionaria. Ouawk -F, '{print $2}'
para a segunda variação.FNR
sirva tão bem quanto++n
Respostas:
Não é perto de um terminal para testar, mas e o
nl
comando muitas vezes esquecido ? Algo como:cut -f 2 -d , original.csv | nl -w 1 -p -s , > numbered.csv
fonte
cut -d, -f 2- /tmp/aa | nl -w 1 -p -s ,
-w 1
vez de numeração à esquerda.cut
comando antes do símbolo de barra vertical (|
) fornecerá apenas a segunda coluna, com números de linhas implícitos.Aqui estão algumas abordagens, mas nenhuma abordará a velocidade da solução
cut
enl
acima:awk
Perl
ou
Shell (mas eu não o recomendo para um arquivo 200G, isso levará séculos)
As soluções acima são classificadas em ordem de velocidade. Eu testei no meu laptop e um arquivo de 40M e eles tiraram (média de 10 execuções) 2,22282 (awk), 2,4555 (1º perl), 3,1825s (2º perl) e um impressionante 48.6035s para o shell. A solução
cut
e anl
solução mais inteligentes que você já possui foram cerca de 4 vezes mais rápidas a 0,6078s.fonte
printf
porecho
, o tempo melhora significativamente?$1
abordagem comawk
. Acut
solução é definitivamente muito mais rápida, mas é de se esperar, pois não substitui<alphanumerical_identifier>
por nada. Eu acho que o mais rápidoawk
variante poderia ser algo como:mawk 'BEGIN{FS=OFS=","}{$1=NR}1' file.csv > newfile.csv
.OFS
vez de imprimir explicitamente,
seria um pouco mais rápido e isso pode resultar em uma diferença significativa em arquivos grandes.