Saya telah memeriksa jawaban di utas bermanfaat ini , tetapi masalah saya tampaknya cukup berbeda sehingga saya tidak bisa memikirkan jawaban yang baik (setidaknya dengan sed
).
Saya memiliki file CSV besar (200+ GB) dengan baris yang terlihat seperti berikut:
<alphanumerical_identifier>,<number>
di mana <alphanumerical_identifier>
unik di seluruh file. Saya ingin membuat file terpisah yang menggantikan kolom pertama dengan indeks , yaitu
<index>,<number>
sehingga kita dapatkan:
1, <number>
2, <number>
3, <number>
Dapatkah awk
menghasilkan indeks yang meningkat tanpa memuat file lengkap dalam memori?
Karena indeks meningkat secara monoton, mungkin lebih baik jika hanya menjatuhkan indeks. Akankah solusi untuk itu berbeda ?, yaitu:
<number>
<number>
<number>
awk -F, '{print ++n, $2}'
akan berhasil. Atauawk -F, '{print $2}'
untuk variasi kedua.FNR
akan berfungsi sebaik++n
Jawaban:
Tidak dekat terminal untuk diuji, tetapi bagaimana dengan perintah yang sering diabaikan
nl
? Sesuatu seperti:cut -f 2 -d , original.csv | nl -w 1 -p -s , > numbered.csv
sumber
cut -d, -f 2- /tmp/aa | nl -w 1 -p -s ,
-w 1
alih-alih penomoran angka kiri.cut
perintah sebelum simbol pipa (|
) akan memberi Anda hanya kolom kedua, yang secara efektif memiliki nomor baris tersirat.Berikut adalah beberapa pendekatan, tetapi tidak ada yang akan mendekati kecepatan
cut
dannl
solusi di atas:awk
Perl
atau
Shell (tapi saya tidak merekomendasikannya untuk file 200G, ini akan memakan waktu lama)
Solusi di atas diurutkan dalam urutan kecepatan. Saya menguji pada laptop saya dan file 40M dan mereka mengambil (rata-rata 10 berjalan) 2.2282 (awk), 2.4555 (perl 1), 3.1825s (perl 2) dan 48.6035s kekalahan untuk shell. Solusi yang sangat cerdas
cut
dannl
sudah Anda miliki adalah sekitar 4 kali lebih cepat pada 0,6078.sumber
printf
denganecho
, apakah waktunya membaik secara signifikan?$1
pendekatan denganawk
. Thecut
solusi pasti jauh lebih cepat, tapi itu yang diharapkan karena tidak menggantikan<alphanumerical_identifier>
dengan apa pun. Saya pikir tercepatawk
varian mungkin sesuatu seperti:mawk 'BEGIN{FS=OFS=","}{$1=NR}1' file.csv > newfile.csv
.OFS
alih-alih mencetak secara eksplisit,
akan sedikit lebih cepat dan itu mungkin menambahkan hingga perbedaan yang signifikan dalam file besar.