Лучший способ объединить множество файлов, кроме tail?

Вопрос или проблема

Я хотел бы объединить все файлы определенного типа в каталоге, исключая первые две строки в каждом файле.

Я пробовал 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, так как они обычно более эффективны для этой задачи.

Оцените материал
Добавить комментарий

Капча загружается...