Ich habe die Antworten in diesem hilfreichen Thread durchgesehen , aber mein Problem scheint so unterschiedlich zu sein, dass mir (zumindest mit sed
) keine gute Antwort einfällt .
Ich habe eine große CSV-Datei (200+ GB) mit Zeilen, die wie folgt aussehen:
<alphanumerical_identifier>,<number>
wo <alphanumerical_identifier>
ist über die gesamte Datei eindeutig. Ich möchte eine separate Datei erstellen, die die erste Spalte durch einen Index ersetzt , d. H.
<index>,<number>
damit wir bekommen:
1, <number>
2, <number>
3, <number>
Kann awk
ein zunehmender Index generiert werden, ohne die gesamte Datei in den Speicher zu laden?
Da der Index monoton ansteigt, ist es möglicherweise noch besser, den Index einfach fallen zu lassen. Wäre die Lösung dafür so anders?, Dh:
<number>
<number>
<number>
awk -F, '{print ++n, $2}'
würde funktionieren. Oderawk -F, '{print $2}'
für die zweite Variante.FNR
es genauso gut dienen würde wie++n
Antworten:
Nicht in der Nähe eines zu testenden Terminals, aber wie wäre es mit dem oft übersehenen
nl
Befehl? Etwas wie:cut -f 2 -d , original.csv | nl -w 1 -p -s , > numbered.csv
quelle
cut -d, -f 2- /tmp/aa | nl -w 1 -p -s ,
-w 1
anstelle der Linksnummerierung zu verwenden .cut
Befehl vor dem Pipe-Symbol (|
) gibt Ihnen nur die zweite Spalte mit impliziten Zeilennummern.Hier sind ein paar Ansätze, aber keiner wird die Geschwindigkeit der Annäherung
cut
undnl
Lösung oben:awk
Perl
oder
Shell (aber ich empfehle es nicht für eine 200G-Datei, es wird ewig dauern)
Die obigen Lösungen sind nach Geschwindigkeit sortiert. Ich habe auf meinem Laptop und einer 40M-Datei getestet und sie haben (durchschnittlich 10 Läufe) 2,2282 (awk), 2,4555 (1. Perl), 3,1825s (2. Perl) und satte 48,6035s für die Shell benötigt. Die sehr clevere
cut
und bereits vorhandenenl
Lösung war mit 0,6078 Sekunden etwa viermal schneller.quelle
printf
mitecho
, nicht verbessert das Timing deutlich?$1
Ansatzes mitawk
. Diecut
Lösung ist definitiv viel schneller, aber das ist zu erwarten, da sie durch<alphanumerical_identifier>
nichts ersetzt wird. Ich denke, die schnellsteawk
Variante könnte so etwas sein wie :mawk 'BEGIN{FS=OFS=","}{$1=NR}1' file.csv > newfile.csv
.OFS
anstelle des expliziten Druckens,
etwas schneller ist und dass dies zu einem signifikanten Unterschied bei großen Dateien führen kann.