Подсчитать пробелы в каталоге BASH
Я просто хочу подсчитать пробельные символы в каталоге, но не знаю, как это сделать с помощью команды AWK. В настоящее время у меня есть этот код
res=0
IFS="
"
cd DirPath
res2=0
res3=0
ws=0
for f in `find . ! -type d`;
do
let " res += `wc -l $f | awk '{print $1}'` "
let " res2 += `wc -c $f | awk '{print $1}'` "
let " res3 += `wc -w $f | awk '{print $1}'` "
let " ws += `wc -c $f | awk -v RS='[[:space:]]' 'END{print NR}'` "
done
но результат очень низкий (176), тогда как у меня в этом каталоге 1300000 символов
Ответы
Чтобы подсчитать количество символов новой строки ( -l), слов ( -w, которые для wcпредставляют собой последовательности непробельных символов , поэтому слова разделяются либо пробелами, либо не символами), символов ( -m) и байтов ( -c), вы можете:
find . -type f -exec cat {} + | wc -lwmc
Однако обратите внимание, что, поскольку catфайлы объединяются, он может дать неправильные результаты для количества слов и символов, если есть файлы, которые не заканчиваются пробельным символом (текстовые файлы должны заканчиваться символом новой строки, который является пробельным символом), как это может закончиться объединением двух байтов в один допустимый символ, например, или соединением двух слов вместе.
Пример:
$ od -tx1 a 0000000 c3 0000001 $ od -tx1 b
0000000 a9
0000001
$ wc -m a b 0 a 0 b 0 total $ cat a b | wc -m
1
$ printf foo > a $ printf bar > b
$ wc -w a b 1 a 1 b 2 total $ cat a b | wc -w
1
Чтобы подсчитать пробельные символы, POSIXly, вы можете сделать:
find . -type f -exec cat {} + | tr -cd '[:space:]' | wc -m
(с той же оговоркой о соединении байтов в символы), но обратите внимание, что с GNU trэто работает только для однобайтовых символов (например, не для символов в кодировке UTF-8, отличных от ASCII).
В системах GNU вы можете прибегнуть к GNU grepи использовать:
grep -rzo '[[:space:]]' . | LC_ALL=C tr -cd '\0' | wc -c
Хотя заметим , что , потому что с -z, grepработает на NUL-разделителями записей, которые в конечном итоге прихлебывая целые текстовые файлы в памяти (как текстовые файлы , как правило , не содержат NUL байт).
cd DIRPATH
res2=0
res3=0
ws=0
let " ws += `grep -rzo '[[:space:]]' . | LC_ALL=C tr -cd '\0' | wc -c` "
for f in `find . ! -type d`;
do
let " res += `wc -l $f | awk '{print $1}'` "
let " res2 += `wc -c $f | awk '{print $1}'` "
let " res3 += `wc -w $f | awk '{print $1}'` "
done
Предыдущий код дает вам количество пробелов char в каталоге на ws var
Попробуйте GNU grep:
grep -ro '[[:space:]]' | wc -l