Подсчитать пробелы в каталоге BASH

Aug 24 2020

Я просто хочу подсчитать пробельные символы в каталоге, но не знаю, как это сделать с помощью команды 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 символов

Ответы

1 StéphaneChazelas Aug 24 2020 at 16:48

Чтобы подсчитать количество символов новой строки ( -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 байт).

ApoSkunz Aug 24 2020 at 16:31
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

pLumo Aug 24 2020 at 16:17

Попробуйте GNU grep:

grep -ro '[[:space:]]' | wc -l