Я делаю большое управление файлом в моей системе, и в одном конкретном пакетном задании я заканчиваю с файлом приблизительно на 16 Гбит. Я должен подготовить эти данные в меньшие блоки для другого процесса.
Я разделил его на 10k строки на файл и числовой индекс, дополненный к 5 цифрам
split -a 5 -d -l 10000 large_input_file /out_path/out.
Таким образом, я заканчиваю с названными файлами
00000
00001
...
Проблема состоит в том, что этот способ индексировать всегда запускается с 0.
Существует ли способ установить его на произвольное начальное значение индекса? человек ничего не показывает...
Это не имеет большого значения перенумеровать файлы потом.
split -a 5 -d -l 10000 large_input_file /out_path/tmp.
for x in /outpath/tmp.*; do
mv -i -- "$x" "${x%/*}/out.$(printf %05d $((10#${x##*.}+1)))";
done
Обратите внимание на несколько подводных камней:
out.00000
в out.00001
и т. Д. Не работает, потому что глобализация расширяется до лексикографически упорядоченного списка, поэтому первое переименование перезапишет второй файл. В zsh вы можете использовать спецификатор glob (On)
. В других оболочках самый простой способ - также изменить название ствола. 0
в арифметике оболочки приводит к тому, что число интерпретируется в восьмеричном. 10#${…}
вызывает десятичную интерпретацию. printf %05d
- это способ сохранить отступ до 5 цифр. Я думаю, что эта опция не существует в сплите. У меня есть этот баг (запрос на будущее) для coreutils - http://savannah.gnu.org/bugs/?22231