通过Shell脚本计算文件中的字符数


73

我想从EOF字符开始检查文件中的字符数。谁能告诉我如何通过shell脚本来做到这一点

Answers:


110

这样做:

wc -c filename

如果只希望计数而不在输出中重复文件名:

wc -c < filename

编辑:

使用-m数字符而不是字节(如图塞巴斯蒂安的答案)。


4
Sébastien对多字节文件的回答很重要。
Noufal Ibrahim 2011年

如果我想查找特定单词的数量,而无需打开文件,那么?
Sagar Nikam

1
@SagarNikam:您应该提出一个新问题。顺便说一下,如果不打开文件就无法完成此操作,但是我想您的意思是不使用文件编辑器而不是没有执行的程序open()。一种执行您想要的方式的方法是grep -o '\<word\>' file | wc -l
丹尼斯·威廉姆森

1
@ OB7:毫无疑问,文件中要计算的另一个字符是该行末尾的换行符。
丹尼斯·威廉姆森

1
@阿米尔(Amir):awk '{print length}' filename-根据此处
丹尼斯·威廉姆森

23
#!/bin/sh

wc -m $1 | awk '{print $1}'

wc -m计算字符数;的awk命令仅打印字符数,而忽略文件名。

wc -c 将为您提供字节数(可以与字符数不同,这取决于您可能在几个字节上编码一个字符)。


3
让wc从stdin读取而不是从文件(wc -m < "$1")读取,这意味着您不必通过awk传递输出来删除文件名。
glenn jackman 2011年

可能未安装awk。cut -f1 -d' '相反,使用起来更方便。
iFreilicht

5
awk '{t+=length($0)}END{print t}' file3

1
+1可以处理编码的字符,如果您以字符为基础支付翻译费用,那很好:)
neurino

3

要获取字符串的准确字符数,请使用printf(而不是echo,cat或直接在文件上运行wc -c),因为使用echo,cat等将计算换行符,这将为您提供包括换行符。因此,如果使用echo等,则文本为“ hello”的文件将显示6,但是如果使用printf,则它将返回精确的5,因为没有换行元素要计数。

如何使用printf计数字符串中的字符:

$printf '6chars' | wc -m
6

要将其转换为脚本,可以在文本文件上运行以计算字符数,将以下内容保存在名为print-character-amount.sh的文件中:

#!/bin/bash
characters=$(cat "$1")
printf "$characters" | wc -m

在包含上述文本的文件print-character-amount.sh上使用chmod + x,将文件放置在PATH中(即/ usr / bin /或.bashrc文件中作为PATH导出的任何目录),然后对文本文件类型运行脚本:

print-character-amount.sh file-to-count-characters-of.txt

1

仅awk

awk 'BEGIN{FS=""}{for(i=1;i<=NF;i++)c++}END{print "total chars:"c}' file

仅外壳

var=$(<file)
echo ${#var}

红宝石(1.9+)

ruby -0777 -ne 'print $_.size' file

0

下面的脚本经过测试,可以准确给出预期的结果

\#!/bin/bash

echo "Enter the file name"

read file

echo "enter the word to be found"

read word

count=0

for i in \`cat $file`

do

if [ $i == $word ]

then

count=\`expr $count + 1`

fi

done

echo "The number of words are $count"

1
嗯..试图格式化代码-但失败;-)请改进。
kleopatra 2013年

0

我本以为,最好使用stat查找文件的大小,因为文件系统已经知道了,而不是使整个文件必须用awk或来读取,wc尤其是如果是多GB的文件或一个可能不在HSM上的文件系统中的文件。

stat -c%s file

是的,我承认它不能解决多字节字符的问题,但可以补充一点,OP从未明确这是否是一个问题。


在我看来,您不必原谅自己添加答案。双方statwc花了0.001S告诉我的字节数在1GB的文件,顺便说一句。
andersoyvind

0

归功于user.py等。


echo "ää" > /tmp/your_file.txt
cat /tmp/your_file.txt | wc -m

结果3

在我的示例中,结果应为2(字母两次ä)。但是,echo(或vi)\n在输出(或文件)的末尾添加了一个换行符。因此,计算了两个äLinux换行符\n。那是三个。

使用管道|不是最短的变体,但是我必须wc心里了解较少的参数。另外,cat以我的经验是防弹的。

在Ubuntu 18.04.1 LTS(Bionic Beaver)上进行了测试。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.