Скрипт для несортированного ввода
Вы можете использовать следующий скрипт.Я не использовал close
, поскольку теперь число открытых файлов составляет только #uniqueIDs / 50 вместо # uniqueIDs.
awk -F, 'NR > 1 {
if (!($2 in mapIdToPart)) {
if (uniqueIds % 50 == 0) {
maxPart++;
}
mapIdToPart[$2] = maxPart;
uniqueIds++;
}
print >> "part"mapIdToPart[$2]".csv";
}' input.csv
Это создает файлы part#.csv
, где #
- номер текущегочасть.Входной файл не должен быть отсортирован.Строки с одинаковыми идентификаторами перейдут в одну и ту же часть.Порядок строк в каждой части соответствует порядку строк во входном файле.Каждая часть имеет 50 (или меньше, для последней части) уникальных идентификаторов.
Скрипт для отсортированного ввода
Вы можете ускорить выполнение скрипта, когда ваш входной файл отсортирован по идентификаторам, потому что тогда выне требуется отображение mapIdToPart
, и каждая сгенерированная часть записывается за один раз.
Порядок может быть алфавитным, числовым, ..., это не имеет значения.Здесь я предположил, что отсортированный файл больше не имеет заголовка.Если заголовок все еще существует, добавьте NR > 1
в начале сценария awk
.
awk -F, '{
if ($2 != lastId) {
lastId = $2;
if (uniqueIds % 50 == 0) {
close("part"maxPart".csv");
maxPart++;
}
uniqueIds++;
}
print >> "part"maxPart".csv";
}' sorted.csv
Benchmark
Чтобы протестировать сценарий, я сгенерировал примеры данных, используя
n=98""000""000; paste -d,
<(shuf -i 10""000-99""000 -r -n "$n") \
<(shuf -i 0-9""999 -r -n "$n") \
| cat <(echo data,id) - > input.csv
Образцы данных содержали два столбца и 98 миллионов строк с числами в них.Там где 10 тысяч уникальных идентификаторов.Измеренные времена, когда
- 3m 54s для запуска первого сценария на несортированном вводе.
- 1m 19s для сортировки ввода с использованием
tail -n +2 input.csv | LC_ALL=C sort -t, -k2 > sorted.csv
.Часть tail
удаляет заголовок. - 1 м 48 с для запуска второго сценария на отсортированном вводе.
- 3 м 07 с Для сортировки и запуска второго сценария.
Вывод: Даже если ваш ввод не отсортирован, может быть быстрее выполнить сортировку и запустить второй сценарий.