计算目录 BASH 中的空格数

计算目录 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 个字符

答案1

计算换行符 ( -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 系统上,您可以求助于 GNUgrep并使用:

grep -rzo '[[:space:]]' . | LC_ALL=C tr -cd '\0' | wc -c

但请注意,由于-z,grep适用于 NUL 分隔的记录,因此最终会占用内存中的整个文本文件(因为文本文件通常不包含 NUL 字节)。

答案2

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

上面的代码给出了 ws var 目录中空白字符的数量

答案3

尝试使用GNU grep

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

相关内容