我只想计算目录中的空白字符,但没有找到如何使用 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