Скопируйте огромный файл, пропустив первую строку, используя dd в Linux

647
Jimson Kannanthara James

Я пытался скопировать содержимое огромного файла (10 ГБ) в другой, пропустив первую строку (как в head -n1). Я пробовал несколько способов головы, хвоста, awk и sed. Решено на использованиеtail -n+2 > ./xab.1

см. ссылку1 ссылку2 ссылку3 . Но обработка занимает время журнала. Больше, чем нужно cp.

Я просто хочу слепо копировать контент, вот и все. Поэтому я думаю, ddчто сделаю работу, но я в недоумении, реализуя ее. Любая помощь?

Ну, чтобы дать больше контекста, файл CSV, и поэтому я думаю, dd if=/dev/zero of=/path/to/file bs=1 seek=1 count=<<length(head -n1 /path/to/file)>> conv=notruncчто работа должна работать.

Но как заставить это работать ??

РЕДАКТИРОВАТЬ: Итак, вот то, что я до сих пор придумал, (да, я знаю, что я потеряю несколько записей. Но это не имеет значения)

#!/bin/bash echo "Initiating xaa." `date` head -n3 /stage/csv/dev/data/csv_huge/xaa > /stage/csv/dev/data/csv_huge/csv/header tail -n3 /stage/csv/dev/data/csv_huge/xbc > /stage/csv/dev/data/csv_huge/csv/trailer sed -i '$ d' /stage/csv/dev/data/csv_huge/xaa cat /stage/csv/dev/data/csv_huge/csv/trailer >> /stage/csv/dev/data/csv_huge/xaa mv /stage/csv/dev/data/csv_huge/xaa /stage/csv/dev/data/csv_huge/csv/xaa echo "Completed xaa." `date` sed -i 1d /stage/csv/dev/data/csv_huge/xab sed -i '$ d' /stage/csv/dev/data/csv_huge/xab cat /stage/csv/dev/data/csv_huge/csv/header /stage/csv/dev/data/csv_huge/xab > /stage/csv/dev/data/csv_huge/csv/xab cat /stage/csv/dev/data/csv_huge/csv/trailer >> /stage/csv/dev/data/csv_huge/csv/xab rm -f /stage/csv/dev/data/csv_huge/xab echo "Completed xab." `date` sed -i 1d /stage/csv/dev/data/csv_huge/xbc cat /stage/csv/dev/data/csv_huge/csv/header /stage/csv/dev/data/csv_huge/xbc > /stage/csv/dev/data/csv_huge/csv/xbc echo "Completed xbc." `date` 
0
это выглядит как очень опасное использование `dd` (он же Destroy Disk). определение вашего `if` в качестве / dev / zero также кажется весьма далеким. также ваш счет будет длина первой строки, а не длина файла без заголовка. в любом случае, вы должны ожидать, что это займет некоторое время, и TBH, нет веской причины не просто копировать файл, а затем удалять верхнюю строку. Я должен предположить, что вы делаете все это по непрактичным причинам. Frank Thomas 9 лет назад 0
@FrankThomas Я определенно за "просто скопируйте файл, а затем удалите верхнюю строку". Но как это сделать для 10 ГБ файла - проблема для меня. Любая идея приходит на ум? Jimson Kannanthara James 9 лет назад 0
Вы уже отклонили некоторые из самых популярных идей как слишком медленные, но здесь есть пара других: http://superuser.com/questions/284258/remove-first-line-in-bash Frank Thomas 9 лет назад 0
http://superuser.com/questions/284258/remove-first-line-in-bash - добавлен ответ, как использовать `dd` Hannu 9 лет назад 0
@FrankThomas, это было круто. Пожалуйста, смотрите вопрос, отредактированный с тем, что я придумал, основываясь на этом комментарии. Дайте мне знать, что вы, ребята, думаете. Jimson Kannanthara James 9 лет назад 0
@Hannu наверняка попробует подход `dd`. Jimson Kannanthara James 9 лет назад 0
Для гигабайтов данных вы будете заполнять буферы драйверов довольно скоро, скорости чтения / записи задействованных дисков будут иметь ограничивающий эффект независимо от буферизации файлов (то есть `bs =` for `dd`). Hannu 9 лет назад 0
@Hannu думает о сравнении этих двух подходов. Jimson Kannanthara James 9 лет назад 0
Чтобы подчеркнуть вышесказанное, мы обладаем знаниями, необходимыми для проведения некоторых тестов скорости диска geek'y; Я бы сказал, что вы * можете * получить разные результаты в зависимости от того, какие диски вы используете. Технология накопителей, буферы, аппаратный драйвер, файловая система и системные издержки усложняют задачу, затрудняя прогнозирование результатов. Hannu 9 лет назад 0

0 ответов на вопрос