使用 bash 计算字符数

使用 bash 计算字符数

我对 bash 很陌生,我正在尝试计算文件中的字符数。我写了以下函数:

function chars(){
    m=$(cat $1)
    m=${#m}
    echo $m
}

echo $(chars $2)在文件上调用它的结果是数字 524,而wc -c在同一文件上调用它的结果是 525。是什么导致了差异?我怎样才能得到相同的结果? (作为一个附带问题 - 我可以将函数的前两行合并为一个吗?)

答案1

wc -c返回字节数。

wc -m返回字符数。

由于您的函数计算字符数,因此我认为您的函数的输出数应该wc -m与 的输出匹配。

答案2

您可以尝试wc如下命令:

echo -n file | wc -m 

这样添加的额外换行符将不会被计算在内wc。通常在文件末尾有一个换行符(由编辑器添加),按wc.因此,如果您也想计算该字符,您应该修改您的解决方案,否则您的函数可以正常工作。

答案3

如果没有看到你的文件,很难确切地说出原因,但这里有一个我整理的小示例文件,它显示了在 Bash 中以这种方式计数的一个问题:

例子

$ cat afile 
blah
blah


<EOF>

<EOF>并不真正存在于文件中,它只是向大家展示该文件末尾有 2 个空行。因此,只要手动计算该文件,其中就有 12 个字符,假设 8 + 4(换行)。

使用典型方法对该文件进行计数:

$ wc -m afile 
12 afile

字节数:

$ wc -c afile 
12 afile

使用你的方法:

$ m=$(< afile)
$ echo ${#m}
9

看来这种计数方法并不像您期望的那样工作。它无法计算不\n包含其他字符的行中出现的行结束字符 ( )。

你的问题

根据您对问题的解释,524 与 525,听起来示例文件中有一个空行。

我会在此应用程序中使用wc,而不是尝试推出自己的解决方案。这些工具的存在是有原因的,不要重新发明轮子。 Unix 已经为您的汽车制作了光滑的弹匣。

相关内容