J'ai parcouru les réponses dans ce fil utile , mais mon problème semble être suffisamment différent pour que je ne puisse pas penser à une bonne réponse (au moins avec sed
).
J'ai un gros fichier CSV (200+ Go) avec des lignes qui ressemblent à ceci:
<alphanumerical_identifier>,<number>
où <alphanumerical_identifier>
est unique sur l'ensemble du fichier. Je voudrais créer un fichier séparé qui remplace la première colonne par un index , c'est-à-dire
<index>,<number>
pour que nous obtenions:
1, <number>
2, <number>
3, <number>
Peut awk
générer un index croissant sans charger le fichier complet en mémoire?
Étant donné que l'indice augmente de façon monotone, il peut être encore mieux de simplement laisser tomber l'indice. La solution serait-elle si différente?, À savoir:
<number>
<number>
<number>
awk -F, '{print ++n, $2}'
cela fonctionnerait. Ouawk -F, '{print $2}'
pour la deuxième variation.FNR
cela servirait aussi bien que++n
Réponses:
Pas près d'un terminal pour tester, mais qu'en est-il de la
nl
commande souvent ignorée ? Quelque chose comme:cut -f 2 -d , original.csv | nl -w 1 -p -s , > numbered.csv
la source
cut -d, -f 2- /tmp/aa | nl -w 1 -p -s ,
-w 1
au lieu de la numérotation à gauche.cut
commande avant le symbole de canal (|
) ne vous donnera que la deuxième colonne, ayant effectivement des numéros de ligne implicites.Voici quelques approches, mais aucune approcheront la vitesse de la
cut
etnl
solution ci - dessus:awk
Perl
ou
Shell (mais je ne le recommande pas pour un fichier 200G, cela prendra du temps)
Les solutions ci-dessus sont triées par ordre de vitesse. J'ai testé sur mon ordinateur portable et un fichier de 40M et ils ont pris (moyenne de 10 exécutions) 2,2282 (awk), 2,4555 (1er perl), 3,1825s (2e perl) et un énorme 48,6035s pour le shell. La solution très intelligente
cut
quenl
vous avez déjà était environ 4 fois plus rapide à 0,6078 s.la source
printf
parecho
, le timing s'améliore-t-il de manière significative?$1
approche avecawk
. Lacut
solution est certainement beaucoup plus rapide, mais il faut s'y attendre car elle ne remplace<alphanumerical_identifier>
rien. Je pense que le plus rapideawk
pourrait être quelque chose comme variante:mawk 'BEGIN{FS=OFS=","}{$1=NR}1' file.csv > newfile.csv
.OFS
au lieu de l'impression explicite,
serait légèrement plus rapide et cela pourrait bien entraîner une différence significative dans un fichier énorme.