Есть файл 5 млн. строк.
Нужно достать отдельно каждую строчку(одну), создать файл для каждой одной строчки в отдельный файл который будет с таким же названием как и содержание строчки и поставить ему расширение *db3
Я когда делал, подумал что 5 млн. файлов это не так много же и займет от силы пару часов, поэтому даже не заморачивался и подумал сделать по отдельность так:
#!/bin/bash
if [ -z "$1" ]; then
echo "Нужно указать на файл"
fi
L=1
M=$(wc -l "$1" | egrep -o '^[0-9]+')
N=$((M / L))
if [[ $((N*L)) -lt $M ]]; then
tail -n$((M - N*L)) "$1" > "$1$((N+1))";
fi
for ((i=0; i<N; i++)); do
head -n$((i*L + L)) "$1" | tail -n$L > "$1$i";
done
И на создание 988576 ушло полтора дня(и загрузка одного ядра все это время на 70%), а потом закончилось место, и вот я толком не могу понять какой их них последний, вернее догадываюсь(что это db.txt988586), но боюсь ошибиться, вот
вывод ls
Не пропадать же работе, эти только переименую, а уже потом уже удалю из файла со всеми строчками все до последние и пойду сразу с переименованием и сменой расширения(это тоже переименование по сути)
Ну вот а потом я уже думал поменять названия с расширением файлов:
#!/bin/bash
for f in *; do
d="$(head -1 "$f" | awk '{ print }').html"
if [ ! -f "$d" ]; then
mv "$f" "$d"
else
echo "Файл '$d' уже есть! Пропущен '$f'"
fi
done
Короче основной вопрос это что-то что будет быстрее всего делать это:
Нужно достать отдельно каждую строчку(одну), создать файл для каждой одной строчки в отдельный файл который будет с таким же названием как и содержание строчки и поставить ему расширение *db3
Учитывая что файлов 5 млн где-то выйдет, awk print если сделать в первом скрипте я так понимаю будет еще медленней.
Потом вопрос, стоит ли переименовывать уже готовые файлы около миллиона, или проще заново пройтись если найдется что-нить быстрее?
Ну и еще я немного сомневаюсь, какой файл последний в выводе ls.
Перемещено maxcom из talks