Revisé las respuestas en este útil hilo , pero mi problema parece ser lo suficientemente diferente como para no pensar en una buena respuesta (al menos con sed
).
Tengo un archivo CSV grande (más de 200 GB) con filas que se parecen a lo siguiente:
<alphanumerical_identifier>,<number>
donde <alphanumerical_identifier>
es único en todo el archivo. Me gustaría crear un archivo separado que reemplace la primera columna por un índice , es decir
<index>,<number>
para que obtengamos:
1, <number>
2, <number>
3, <number>
¿Puede awk
generar un índice creciente sin cargar el archivo completo en la memoria?
Dado que el índice aumenta monotónicamente, puede ser aún mejor simplemente dejar caer el índice. ¿Sería la solución para eso tan diferente ?, es decir:
<number>
<number>
<number>
awk -F, '{print ++n, $2}'
funcionaría. Oawk -F, '{print $2}'
para la segunda variación.FNR
serviría tan bien como++n
Respuestas:
No cerca de una terminal para probar, pero ¿qué tal el
nl
comando que a menudo se pasa por alto ? Algo como:cut -f 2 -d , original.csv | nl -w 1 -p -s , > numbered.csv
fuente
cut -d, -f 2- /tmp/aa | nl -w 1 -p -s ,
-w 1
lugar de la numeración izquierda.cut
comando antes del símbolo de canalización (|
) le dará solo la segunda columna, con números de línea implícitos.Aquí hay algunos enfoques, pero ninguno se acercará a la velocidad de la
cut
y lanl
solución anterior:awk
Perl
o
Shell (pero no lo recomiendo para un archivo de 200G, llevará años)
Las soluciones anteriores se ordenan por orden de velocidad. Probé en mi computadora portátil y un archivo de 40M y tomaron (promedio de 10 ejecuciones) 2.2282 (awk), 2.4555 (1er perl), 3.1825s (2do perl) y la friolera de 48.6035s para el shell. El muy inteligente
cut
ynl
solución ya tiene fue alrededor de 4 veces más rápido en 0.6078s.fuente
printf
conecho
, ¿el tiempo mejora significativamente?$1
enfoque conawk
. Lacut
solución es definitivamente mucho más rápida, pero eso es de esperarse ya que no se reemplaza<alphanumerical_identifier>
con nada. Creo que el más rápidoawk
variante podría ser algo como:mawk 'BEGIN{FS=OFS=","}{$1=NR}1' file.csv > newfile.csv
.OFS
lugar de imprimir explícitamente,
sería un poco más rápido y eso puede sumar una diferencia significativa en un archivo enorme.