Вопрос или проблема
Я хотел бы объединить все файлы определенного типа в каталоге, исключая первые две строки в каждом файле.
Я пробовал tail -n +3 path/to/files/foo_bar_* >> BigDataFile.dat
Однако BigDataFile.dat
выглядит так:
path/to/files/foo_bar_1.txt
data1
data2
data3
path/to/files/foo_bar_2.txt
data1
data2
data3
и т.д…
Могу ли я заставить tail
не вставлять комментарий с путем и именем файла и лишнюю строку? Или мне следует использовать другой метод?
Команда cat
подошла бы отлично, но я не нашел хорошего способа избежать включения первых двух строк в файл.
tail
имеет опцию -q
, чтобы подавить вывод заголовков при обработке нескольких файлов.
Другой способ с использованием Awk (хотя, я полагаю, это будет медленнее, чем использование tail
):
awk 'FNR>2' file*
Это в основном означает: если номер текущей записи (текущего файла) больше 2 (что по умолчанию означает: “если номер текущей строки больше 2”), напечатать строку.
% cat file1
f1line1
f1line2
f1line3
% cat file2
f2line1
f2line2
f2line3
% awk 'FNR>2' file*
f1line3
f2line3
Ответ или решение
Для объединения нескольких файлов в одном, исключая первые две строки из каждого файла, существует несколько эффективных способов. Вы упомянули использование команды tail
, но, как вы заметили, она добавляет заголовки с именами файлов. Чтобы избежать этого, можно использовать опцию -q
, чтобы подавить вывод заголовков.
Вот пример команды, которая решит вашу задачу:
tail -n +3 -q path/to/files/foo_bar_* >> BigDataFile.dat
В этом случае -n +3
указывает на то, что мы начинаем выводить строки с третьей, а -q
подавляет заголовки.
Другой способ – использовать awk
, который позволяет более гибко управлять выводом. Вот команда, которая также выполнит задачу:
awk 'FNR > 2' path/to/files/foo_bar_* >> BigDataFile.dat
Объяснение команды awk
:
FNR
– это номер текущей строки в текущем файле.- Сравнение
FNR > 2
означает, что будут выводиться только строки, начиная с третьей.
Вы также можете использовать sed
, чтобы удалять первые две строки из каждого файла, прежде чем конкатенировать их:
sed '1,2d' path/to/files/foo_bar_* >> BigDataFile.dat
С помощью этой команды sed
1,2d
указывает на удаление строк с 1 по 2.
Итак, можете выбрать любой из предложенных методов в зависимости от ваших предпочтений и требований. Если вам нужны самые быстрые результаты при обработке большого объема данных, старайтесь использовать tail -q
или awk
, так как они обычно более эффективны для этой задачи.