У меня есть набор файлов с похожим шаблоном именования. Я пытаюсь получить общее количество строк всех файлов, объединенных без заголовка, за один раз. Но у меня проблемы с командами.
Я пытался:
Sed '1d' IN-Pass-30* | wc -l
И
Awk 'END {print NR-1}' IN-Pass-30*
Но каждый раз он вычитает количество заголовков только из одного файла. Что я здесь делаю неправильно?
Я предлагаю следующее "простое" решение:
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 строку на файл, поэтому, подсчитав количество строк во всех файлах, вычитая количество файлов (которое совпадает с количеством строк заголовка), вы должны получить желаемый результат.
Вы были близки. Оберните команду sed в цикл bash glob:
for f in IN-Pass-30*; do sed '1d' "$f"; done | wc -l
Вероятно, вы могли бы добавить что-то вроде xargs, чтобы уменьшить количество вызовов sed, но это, вероятно, не стоит усилий, потому что перезагрузка sed из кеша страницы для каждой итерации будет намного быстрее, чем чтение содержимого всех файлов. с диска.
Привет @Dominique Решение, предоставленное Коулом, более элегантно. Но оба работают. Спасибо.