我对 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 已经为您的汽车制作了光滑的弹匣。