UNIX: как подсчитать количество строк в нескольких файлах без заголовков

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

Я пытался:

Sed '1d' IN-Pass-30* | wc -l

И

Awk 'END {print NR-1}' IN-Pass-30*

Но каждый раз он вычитает количество заголовков только из одного файла. Что я здесь делаю неправильно?

Как настроить Tailwind CSS с React.js и Next.js?
Как настроить Tailwind CSS с React.js и Next.js?
Tailwind CSS - единственный фреймворк, который, как я убедился, масштабируется в больших командах. Он легко настраивается, адаптируется к любому...
LeetCode запись решения 2536. Увеличение подматриц на единицу
LeetCode запись решения 2536. Увеличение подматриц на единицу
Увеличение подматриц на единицу - LeetCode
Переключение светлых/темных тем
Переключение светлых/темных тем
В Microsoft Training - Guided Project - Build a simple website with web pages, CSS files and JavaScript files, мы объясняем, как CSS можно...
Отношения "многие ко многим" в Laravel с методами присоединения и отсоединения
Отношения "многие ко многим" в Laravel с методами присоединения и отсоединения
Отношения "многие ко многим" в Laravel могут быть немного сложными, но с помощью Eloquent ORM и его моделей мы можем сделать это с легкостью. В этой...
В PHP
В PHP
В большой кодовой базе с множеством различных компонентов классы, функции и константы могут иметь одинаковые имена. Это может привести к путанице и...
Карта дорог Беладжар PHP Laravel
Карта дорог Беладжар PHP Laravel
Laravel - это PHP-фреймворк, разработанный для облегчения разработки веб-приложений. Laravel предоставляет различные функции, упрощающие разработку...
1
0
63
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я предлагаю следующее "простое" решение:

Prompt> find ./ -maxdepth 1 -name "IN-Pass-30*" | wc -l
53
Prompt> cat IN-Pass-30* | wc -l
1418549
Prompt> echo $(($(cat IN-Pass-30* | wc -l) - $(find ./ -maxdepth 1 -name "IN-Pass-30*" | wc -l)))
1418496

Что это значит?

Prompt> find ./ -maxdepth 1 -name "IN-Pass-30*" | wc -l
// find all files inside that directory without checking subdirectories.
// once they are found, count them.

Prompt> cat IN-Pass-30* | wc -l
// use `cat` to concatenate all files' content.
// at the end, count the amount of lines.

Prompt> echo $$(a - b))
// calculate the difference between a and b.

Prompt> echo $(command)
// show (or do whatever with it) the result of a command

О, вся идея в том, что заголовок занимает 1 строку на файл, поэтому, подсчитав количество строк во всех файлах, вычитая количество файлов (которое совпадает с количеством строк заголовка), вы должны получить желаемый результат.

Привет @Dominique Решение, предоставленное Коулом, более элегантно. Но оба работают. Спасибо.

noob 18.11.2022 15:36
Ответ принят как подходящий

Вы были близки. Оберните команду sed в цикл bash glob:

for f in IN-Pass-30*; do sed '1d' "$f"; done | wc -l

Вероятно, вы могли бы добавить что-то вроде xargs, чтобы уменьшить количество вызовов sed, но это, вероятно, не стоит усилий, потому что перезагрузка sed из кеша страницы для каждой итерации будет намного быстрее, чем чтение содержимого всех файлов. с диска.

Andrew Henle 18.11.2022 15:22

Другие вопросы по теме