我正在尝试使用多个集合而不确定如何

时间:2014-02-25 02:58:05

标签: bash tr wc

我用过:

tr -dc [:alpha:] < $fileDoc | wc -c

计算所有字母,

tr -dc ' ' < $fileDoc | wc -c

计算所有空格,

tr -dc '\n' < $fileDoc | wc -c

计算文本文档中的所有新行。

我现在想要做的是计算文档中的所有其他字符,因为我将调用其他所有字符。

以下是文件中的文字:

您好,这是一个测试文本文档。

123

!@#

有没有办法删除找到的所有[:alpha:]\n并计算其余字符?

2 个答案:

答案 0 :(得分:2)

这应该可以解决问题

tr -d '[:alpha:] \n'  < $fileDoc | wc -c

或许如果你想在空白的定义中加入标签

tr -d '[:alpha:][:space:]'  < $fileDoc | wc -c

根据OP的评论,删除字母,空格,数字和换行符并计算所有剩余字符:

tr -d '[:alnum:][:space:]' < $fileDoc | wc -c

[:alnum:]说明字母和数字的字母。 [:space:]负责处理所有空格,包括换行符

答案 1 :(得分:1)

只是在这里发帖以供参考,如果你想一次性完成所有操作,那么这个awk脚本应该可以工作:

awk -v FS='' '
{
    for(i=1; i<=NF; i++) {
        if($i ~ /[a-zA-Z]/) {alpha++};
        if($i == " ") {space++};
        if($i !~ /[A-Za-z0-9 ]/) {spl++}
    }
}
END {
    printf "Space=%s, Alphabets=%s, SplChars=%s, NewLines=%s\n", space, alpha, spl, NR
}' file

$ cat file
This is a text
I want to count
alot of $tuff
in 1 single shot

$ awk -v FS='' '
{
    for(i=1; i<=NF; i++) {
        if($i ~ /[a-zA-Z]/) {alpha++};
        if($i == " ") {space++};
        if($i !~ /[A-Za-z0-9 ]/) {spl++}
    }
}
END {
    printf "Space=%s, Alphabets=%s, SplChars=%s, NewLines=%s\n", space, alpha, spl, NR
}' file
Space=11, Alphabets=45, SplChars=1, NewLines=4