Как вы указываете количество строк каждого файла в каталоге в человекообразном формате.

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

  1. Сколько строк в каждом файле.
  2. Сколько строк находится в каталоге.
  3. Сколько строк в целом

Самое главное, мне нужно это в «удобочитаемом формате», например. 12 345 678, а не 12345678

Было бы неплохо научиться делать это тремя способами. Обычные инструменты ванильного bash, awk и т. Д., И perl (или python).

26 голосов | спросил Hexatonic 7 FebruaryEurope/MoscowbSun, 07 Feb 2016 22:16:23 +0300000000pmSun, 07 Feb 2016 22:16:23 +030016 2016, 22:16:23

4 ответа


38
  

Сколько строк в каждом файле.

Используйте wc, изначально для подсчета слов, я считаю, но он может делать строки, слова, символы, байты и самый длинный длина линии. Опция -l указывает ей на подсчет строк.

wc -l <filename>

Это выведет количество строк в:

$ wc -l /dir/file.txt
32724 /dir/file.txt

Вы также можете передавать данные в wc:

$ cat /dir/file.txt | wc -l
32724
$ curl google.com --silent | wc -l
63
  

Сколько строк находится в каталоге.

Try:

find . -name '*.pl' | xargs wc -l

другой однострочный:

( find ./ -name '*.pl' -print0 | xargs -0 cat ) | wc -l
Команда

BTW, wc подсчитывает новые строки, а не строки. Когда последняя строка в файле не заканчивается новым кодом строки, это не будет считаться.

Вы можете использовать grep -c ^, полный пример:

#this example prints line count for all found files
total=0
find /path -type f -name "*.php" | while read FILE; do
     #you see use grep instead wc ! for properly counting
     count=$(grep -c ^ < "$FILE")
     echo "$FILE has $count lines"
     let total=total+count #in bash, you can convert this for another shell
done
echo TOTAL LINES COUNTED:  $total
  

Сколько строк в общей сложности

Не уверен, что я понял, что вы запросили правильно. например это выведет результаты в следующем формате, показывая количество строк для каждого файла:

# wc -l `find /path/to/directory/ -type f`
 103 /dir/a.php
 378 /dir/b/c.xml
 132 /dir/d/e.xml
 613 total

В качестве альтернативы для вывода может быть полезно только общее количество новых символов линии без файла по количеству файлов в следующей команде:

# find /path/to/directory/ -type f -exec wc -l {} \; | awk '{total += $1} END{print total}'
 613
  

Самое главное, мне нужно это в «удобочитаемом формате», например.   12 345 678, а не 12345678

У Bash есть функция printf , встроенная в:

printf "%0.2f\n" $T

Как всегда, существует множество различных методов, которые можно использовать для достижения тех же результатов, что и здесь.

ответил malyy 7 FebruaryEurope/MoscowbSun, 07 Feb 2016 22:49:30 +0300000000pmSun, 07 Feb 2016 22:49:30 +030016 2016, 22:49:30
5

Во многих случаях объединение команды wc и группового символа * может быть достаточно.
Если все ваши файлы находятся в одном каталоге, вы можете вызвать:

wc -l src/*

Вы также можете перечислить несколько файлов и каталогов:

wc -l file.txt readme src/* include/*

Эта команда покажет список файлов и их количество строк.
Последняя строка будет представлять собой сумму строк из всех файлов.


Считать все файлы в каталоге рекурсивно:

Сначала включите globstar, добавив shopt -s globstar в ваш .bash_profile. Для поддержки globstar требуется Bash ≥ 4.x, который можно установить с помощью brew install bash, если необходимо. Вы можете проверить свою версию с помощью bash --version.

Затем запустите:

wc -l **/*

Обратите внимание, что этот вывод будет некорректным, если globstar не включен.

ответил Thomio 30 Jpm1000000pmMon, 30 Jan 2017 22:22:56 +030017 2017, 22:22:56
1

немного поздно к игре, но я получил кучу ошибок аргументов с вышеизложенным из-за размера каталога. Это сработало для меня:

for i in $(find . -type f); do wc -l $i; done >> /home/counts.txt

ответил Ron Paulfan 17 AM00000020000001031 2018, 02:50:10
0

Эта команда даст список строк в каждом каталоге:

find . -name '*.*' -type f | xargs wc -l
ответил Suresh.A 8 MarpmThu, 08 Mar 2018 17:24:13 +03002018-03-08T17:24:13+03:0005 2018, 17:24:13

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132