Przejrzałem odpowiedzi w tym pomocnym wątku , ale mój problem wydaje się na tyle inny, że nie mogę wymyślić dobrej odpowiedzi (przynajmniej z sed
).
Mam duży plik CSV (ponad 200 GB) z wierszami, które wyglądają następująco:
<alphanumerical_identifier>,<number>
gdzie <alphanumerical_identifier>
jest unikalny w całym pliku. Chciałbym utworzyć osobny plik, który zastąpi pierwszą kolumnę indeksem , tj
<index>,<number>
abyśmy otrzymali:
1, <number>
2, <number>
3, <number>
Czy można awk
wygenerować rosnący indeks bez ładowania pełnego pliku do pamięci?
Ponieważ indeks rośnie monotonicznie, może być jeszcze lepiej po prostu go upuścić. Czy rozwiązanie tego byłoby takie inne ?, tj .:
<number>
<number>
<number>
awk -F, '{print ++n, $2}'
działałoby. Lubawk -F, '{print $2}'
dla drugiej odmiany.FNR
tyle, ale i tak będzie dobrze++n
Odpowiedzi:
Nie w pobliżu terminala do przetestowania, ale co powiesz na często pomijane
nl
polecenie? Coś jak:cut -f 2 -d , original.csv | nl -w 1 -p -s , > numbered.csv
źródło
cut -d, -f 2- /tmp/aa | nl -w 1 -p -s ,
-w 1
zamiast numerowania po lewej stronie.cut
polecenie przed symbolem potoku (|
) da ci tylko drugą kolumnę, skutecznie mającą niejawne numery linii.Oto kilka podejść, ale żadne nie zbliży się do prędkości powyższego rozwiązania
cut
inl
:awk
Perl
lub
Shell (ale nie polecam go do pliku 200G, zajmie to wieki)
Powyższe rozwiązania są posortowane według prędkości. Przetestowałem na moim laptopie i pliku 40M, a oni wzięli (średnio 10 uruchomień) 2.2282 (awk), 2.4555 (1. perl), 3.1825s (2. perl) i aż 48.6035s dla powłoki. Bardzo mądry
cut
inl
rozwiązanie masz już było około 4 razy szybciej w 0.6078s.źródło
printf
sięecho
, czy czas znacząco poprawić?$1
podejścia za pomocąawk
.cut
Rozwiązanie jest zdecydowanie szybszy, ale to należy się spodziewać, gdyż nie zastąpić<alphanumerical_identifier>
niczym. Myślę najszybszyawk
wariant może być coś takiego:mawk 'BEGIN{FS=OFS=","}{$1=NR}1' file.csv > newfile.csv
.OFS
zamiast jawnego drukowania,
byłoby nieco szybsze, co może przyczynić się do znacznej różnicy w dużych plikach.