В этом ответе ( Как я могу удалить первую строку файла с помощью sed? ) Есть два способа удалить первую запись в файле:
sed '1d' $file >> headerless.txt
** ---------------- ИЛИ ----------------**
tail -n +2 $file >> headerless.txt
Лично я думаю, что этот tail
вариант косметически более приятен и более читабелен, но, вероятно, потому, что мне бросают вызов.
Какой метод самый быстрый?
sed
он более переносим: «+2»tail
отлично работает на Ubuntu, который использует GNUtail
, но не работает на BSDtail
.tail
отсутствием кроссплатформенной совместимости.-n
опцию и использовал синтаксисtail +2 $file
. См. Freebsd.org/cgi/… Возможно, вы подумали об этом, а не об одном из современных BSD.Ответы:
Производительность
sed
vs.tail
убрать первую строку файлаTL; DR
sed
очень мощный и универсальный, но именно это делает его медленным, особенно для больших файлов с большим количеством строк.tail
делает только одну простую вещь, но она делает это хорошо и быстро, даже для больших файлов с множеством строк.Для файлов малого и среднего размера
sed
иtail
выполняются одинаково быстро (или медленно, в зависимости от ваших ожиданий). Однако для больших входных файлов (несколько МБ) разница в производительности значительно возрастает (на порядок для файлов в диапазоне сотен МБ) сtail
явно более высокими показателямиsed
.эксперимент
Общие препараты:
Наши команды для анализа:
Обратите внимание, что
/dev/null
каждый раз я отправляю выходные данные, чтобы устранить вывод терминала или запись в файл как узкое место в производительности.Давайте настроим RAM-диск для устранения дискового ввода-вывода как потенциального узкого места. Лично у меня есть
tmpfs
навесное устройство,/tmp
поэтому я просто разместил свойtestfile
там для этого эксперимента.Затем я однажды создаю случайный тестовый файл, содержащий определенное количество строк
$numoflines
со случайной длиной строки и случайными данными, используя эту команду (обратите внимание, что она определенно не оптимальна, она становится действительно медленной примерно для> 2 миллионов строк, но кого это волнует, это не что мы анализируем)О, кстати. мой тестовый ноутбук работает под управлением Ubuntu 16.04, 64-разрядная версия на процессоре Intel i5-6200U. Просто для сравнения.
Сроки больших файлов:
Настройка огромная
testfile
:Выполнение вышеуказанной команды с
numoflines=10000000
получением случайного файла, содержащего 10M строк, занимающих чуть более 600 МБ - это довольно много, но давайте начнем с этого, потому что мы можем:Выполните запуски по времени с нашим огромным
testfile
:Теперь давайте сначала выполним однократный запуск обеих команд, чтобы оценить, с какими величинами мы работаем.
Мы уже видим действительно четкий результат для больших файлов,
tail
это на порядок быстрее, чемsed
. Но просто для удовольствия и чтобы убедиться, что нет никаких случайных побочных эффектов, имеющих большое значение, давайте сделаем это 100 раз:Вывод остается прежним,
sed
неэффективно удалять первую строку большого файла,tail
следует использовать там.И да, я знаю, что циклические конструкции Bash медленны, но мы делаем здесь лишь относительно немного итераций, и время, которое занимает простой цикл, не так существенно по сравнению с
sed
/tail
runtime.Сроки небольших файлов:
Настройка небольшая
testfile
:Теперь для полноты давайте рассмотрим более распространенный случай, когда у вас есть небольшой входной файл в диапазоне кБ. Давайте создадим случайный входной файл
numoflines=100
, который выглядит следующим образом:Выполните запуск по времени с нашим маленьким
testfile
:Исходя из опыта, мы можем ожидать, что время для таких маленьких файлов будет в пределах нескольких миллисекунд, давайте сразу сделаем 1000 итераций:
Как видите, сроки очень похожи, толковать или удивляться особо нечему. Для небольших файлов оба инструмента одинаково хорошо подходят.
источник
awk
тоже может это сделать. Мой оригинальный вопрос был основан на ссылке, которую я нашел в первую очередь. После всей вашей тяжелой работы, пожалуйста, посоветуйте, если мне следует выбратьawk
кандидатуру решения и вернуть фокус только на первоначальный объем проектаsed
иtail
.awk 'NR > 1'
, что интересно).Вот еще один вариант, использующий только встроенные команды bash и
cat
:$file
перенаправляется в{ }
группировку команд.read
Просто читает и сбрасывает первую строку. Затем остальная часть потока передается по каналу, вcat
который записывается в файл назначения.На моем Ubuntu 16.04 производительность этого и
tail
решения очень похожи. Я создал большой тестовый файл сseq
:tail
решение:cat
/ скобное решение:Хотя сейчас у меня есть только Ubuntu VM, и я видел значительные различия во времени обоих, хотя они все находятся на одной площадке.
источник
tail
но все же думаю, чтоread
вариант очень крутой.Попробовав в своей системе и добавив к каждой команде префикс,
time
я получил следующие результаты:СЭД:
и хвост:
что говорит о том, что на моей системе хотя бы AMD FX 8250 с Ubuntu 16.04 хвост значительно быстрее. Тестовый файл имел 10 000 строк размером 540 КБ. Файл был прочитан с жесткого диска.
источник
sed
может сыграть решающую роль в этом результате, именно в этом порядке вы его проверили.sed
был примерно в два раза быстрее.Нет объективного способа сказать, что лучше, потому что
sed
иtail
это не единственные вещи, которые запускаются в системе во время выполнения программы. Множество факторов, таких как дисковый ввод-вывод, сетевой ввод-вывод, прерывания процессора для процессов с более высоким приоритетом, влияют на скорость выполнения вашей программы.Они оба написаны на C, так что это не языковая проблема, а скорее экологическая. Например, у меня есть SSD, и в моей системе это займет время в микросекундах, но для того же файла на жестком диске это займет больше времени, потому что жесткие диски значительно медленнее. Таким образом, аппаратная часть играет роль в этом тоже.
Есть несколько вещей, которые вы можете иметь в виду при выборе команды:
sed
потоковый редактор для преобразования текста.tail
для вывода определенных строк текста. Если вы хотите разобраться со строками и только распечатать их, используйтеtail
. Если вы хотите редактировать текст, используйтеsed
.tail
имеет гораздо более простой синтаксис, чемsed
, поэтому используйте то, что вы можете прочитать сами, а что могут читать другие.Другим важным фактором является объем данных, которые вы обрабатываете. Маленькие файлы не дадут вам никакой разницы в производительности. Картина становится интересной, когда вы имеете дело с большими файлами. С помощью файла BIGFILE.txt размером 2 ГБ мы видим, что в
sed
нем гораздо больше системных вызовов, чем онtail
, и он работает значительно медленнее.источник
tail
лучше, чемsed
- используйте это. Я лично хотел бы использоватьpython
или ,awk
а неsed
потому , что он может получить комплекс. Кроме того, если вы беспокоитесь о производительности, давайте посмотрим правде в глаза - вы видите результаты в микросекундах здесь. Вы не почувствуете разницы, если вы не пытаетесь прочитать этот огромный файл в диапазоне гигабайтawk
ответ:) ... Мой вопрос был основан на других вопросах и ответах AU (в ссылке), и там они никогда не упоминалисьawk
. Я согласен, что разница во времени является номинальной для небольших файлов. Я просто пытался развить хорошие привычки.awk 'NR!=1' input_file.txt
. Это дает мне одинаково тот же результат, около 150 миллисекунд, то же число для обоихtail
иsed
. Но, опять же, я использую SSD, так что я бы сказал, что важны жесткий диск и процессор, а не команда.sed
более 3 минут, тогда как для этогоtail
требуется всего около 20 секунд. Это не что большое пока на самом деле, безусловно , не в диапазоне ГБ.Топ ответ не принимал во внимание диск
> /dev/null
если у вас большой файл и вы не хотите создавать временную копию на вашем диске, попробуйте
vim -c
Изменить: если файл больше, чем доступная память
vim -c
не работает, похоже, что он не достаточно умен, чтобы сделать дополнительную загрузку файлаисточник
Другие ответы хорошо показывают, что лучше создать новый файл с отсутствующей первой строкой. Если вы хотите отредактировать файл, а не создавать новый, я уверен,
ed
что это будет быстрее, потому что он вообще не должен создавать новый файл. Но вы должны искать, как удалить строку,ed
потому что я использовал ее только один раз.источник