Я просмотрел ответы в этой полезной ветке , но моя проблема, похоже, иная, поэтому я не могу придумать хорошего ответа (по крайней мере, с sed
).
У меня есть большой файл CSV (200+ ГБ) со строками, которые выглядят следующим образом:
<alphanumerical_identifier>,<number>
где <alphanumerical_identifier>
уникально для всего файла. Я хотел бы создать отдельный файл, который заменяет первый столбец индексом , т.е.
<index>,<number>
так что мы получаем:
1, <number>
2, <number>
3, <number>
Может awk
генерировать увеличивающийся индекс без загрузки полного файла в память?
Поскольку индекс увеличивается монотонно, может быть, даже лучше просто удалить индекс. Будет ли решение для этого быть другим?
<number>
<number>
<number>
awk -F, '{print ++n, $2}'
бы сработало. Илиawk -F, '{print $2}'
для второго варианта.FNR
бы так же хорошо, как и++n
Ответы:
Не возле терминала для тестирования, а как насчет часто пропускаемой
nl
команды? Что-то вроде:cut -f 2 -d , original.csv | nl -w 1 -p -s , > numbered.csv
источник
cut -d, -f 2- /tmp/aa | nl -w 1 -p -s ,
-w 1
вместо нумерации слева.cut
команда перед символом канала (|
) даст вам только второй столбец, эффективно имеющий неявные номера строк.Вот несколько подходов, но ни один из них не приблизится к скорости
cut
иnl
решению выше:AWK
Perl
или
Shell (но я не рекомендую его для файла 200G, это займет много лет)
Вышеуказанные решения отсортированы в порядке скорости. Я проверил на своем ноутбуке и файл 40M, и они взяли (в среднем 10 прогонов) 2.2282 (awk), 2.4555 (1-й perl), 3.1825s (2-й perl) и колоссальные 48.6035s для оболочки. Очень умный
cut
иnl
решение , которое вы уже было около 4 раза быстрее 0.6078s.источник
printf
наecho
, значительно ли улучшится время?$1
подхода сawk
.cut
Решение, безусловно , гораздо быстрее, но это и следовало ожидать , поскольку она не заменит<alphanumerical_identifier>
ни с чем. Я думаю , что самый быстрыйawk
вариант может быть что - то вроде:mawk 'BEGIN{FS=OFS=","}{$1=NR}1' file.csv > newfile.csv
.OFS
вместо явной печати,
будет немного быстрее, и это может привести к значительной разнице в больших файлах.