shell 如何计算文件中数字/字母的数量?

6za6bjd0  于 2023-10-23  发布在  Shell
关注(0)|答案(5)|浏览(123)

我尝试在Bash中计算文件中的数字和字母的数量。我知道我可以使用wc -c file来计算字符的数量,但我如何将其固定为只有字母,其次是数字?

syqv5f0l

syqv5f0l1#

这里有一种完全避免管道的方法,只是使用tr和shell的方式来给予变量的长度${#variable}

$ cat file
123 sdf
231 (3)
huh? 564
242 wr =!
$ NUMBERS=$(tr -dc '[:digit:]' < file)
$ LETTERS=$(tr -dc '[:alpha:]' < file)
$ ALNUM=$(tr -dc '[:alnum:]' < file)
$ echo ${#NUMBERS} ${#LETTERS} ${#ALNUM}
13 8 21
rjee0c15

rjee0c152#

要计算字母和数字的数量,您可以将合并grepwc结合使用:

grep -Eo '[a-z]' myfile | wc -w
 grep -Eo '[0-9]' myfile | wc -w

只要稍加调整,你就可以修改它来计算数字或字母单词或字母数字单词,

grep -Eo '[a-z]+' myfile | wc -w
grep -Eo '[0-9]+' myfile | wc -w
grep -Eo '[[:alnum:]]+' myfile | wc -w
nzrxty8p

nzrxty8p3#

您可以使用sed替换所有不属于您要查找的类型的字符,然后对结果中的字符进行字数统计。

# 1h;1!H will place all lines into the buffer that way you can replace
# newline characters
sed -n '1h;1!H;${;g;s/[^a-zA-Z]//g;p;}' myfile | wc -c

It's easy enough to just do numbers as well.
sed -n '1h;1!H;${;g;s/[^0-9]//g;p;}' myfile | wc -c

Or why not both.
sed -n '1h;1!H;${;g;s/[^0-9a-zA-Z]//g;p;}' myfile | wc -c
edqdpe6u

edqdpe6u4#

在bash中,有很多方法可以分析文本文件的 * 行 词 * 和 * 字符 * 频率。利用bash内置的字符大小写过滤器(例如,[:upper:],等等),您可以向下钻取到文本文件中每种字符类型的每次出现频率。下面是一个简单的脚本,它从stdin读取并提供正常的wc输出作为第一行输出,然后输出upperlowerdigitspunctwhitespace的数量。

#!/bin/bash

declare -i lines=0
declare -i words=0
declare -i chars=0
declare -i upper=0
declare -i lower=0
declare -i digit=0
declare -i punct=0

oifs="$IFS"

# Read line with new IFS, preserve whitespace
while IFS=$'\n' read -r line; do

    # parse line into words with original IFS
    IFS=$oifs
    set -- $line
    IFS=$'\n'

    # Add up lines, words, chars, upper, lower, digit
    lines=$((lines + 1))
    words=$((words + $#))
    chars=$((chars + ${#line} + 1))
    for ((i = 0; i < ${#line}; i++)); do
        [[ ${line:$((i)):1} =~ [[:upper:]] ]] && ((upper++))
        [[ ${line:$((i)):1} =~ [[:lower:]] ]] && ((lower++))
        [[ ${line:$((i)):1} =~ [[:digit:]] ]] && ((digit++))
        [[ ${line:$((i)):1} =~ [[:punct:]] ]] && ((punct++))
    done
done

echo " $lines $words $chars $file"
echo " upper: $upper,  lower: $lower,  digit: $digit,  punct: $punct,  \
whitespace: $((chars-upper-lower-digit-punct))"

测试输入

$ cat dat/captnjackn.txt
This is a tale
Of Captain Jack Sparrow
A Pirate So Brave
On the Seven Seas.
(along with 2357 other pirates)

示例使用/输出

$ bash wcount3.sh <dat/captnjackn.txt
 5 21 108
 upper: 12,  lower: 68,  digit: 4,  punct: 3,  whitespace: 21

您可以自定义脚本,以便根据需要提供给予尽可能少或尽可能多的细节。如果你有任何问题,请告诉我。

ghhkc1vu

ghhkc1vu5#

通过组合-c(补码)和-d(删除)标志,可以使用tr仅保留字母数字字符。从那里开始,它只是一些管道的问题:

$ cat myfile.txr | tr -cd [:alnum:] | wc -c

相关问题