在UNIX中计算文本的长度

时间:2014-11-06 19:54:13

标签: linux unix awk

我有两个问题:

1)我想从我的脚本中删除每一封非英文字母 2)我想计算文本的长度,从标点符号,空格等中清除。我只是不知道这部分有什么问题

Linux脚本:

    #!/usr/bin/bash

awk '

BEGIN { FS="" } # defining a field separator in order to treat each character one by one
{
    $0 = tolower($0)    # removing case distinctions
    gsub(/[[:punct:]]/,"", $0) # removing every punctuation mark
    gsub(/\ /, "", $0) # removing spaces
    gsub(/[0-9]/, "", $0) # removing digits
    gsub(/![a-z]/, "", $0) # removing every non-English letter <- This does not work

    #After the removing of every possible punctuation mark, space, digit and non-English
    #letter in the user-defined text, we calculate the occurence of each character and place into an array



    for (i = 1; i <= NF; i++)
        {
          freq[$i]++
          length++
        }

}

但它显示以下错误: awk:cmd。第17行:长度++ awk:cmd。第17行:^意外的换行符或字符串结尾

请至少帮我解决第二个问题。我只是没有错,一切似乎都没问题。先谢谢!

2 个答案:

答案 0 :(得分:0)

使用awk

awk '{gsub("[^A-Za-z]", "");i+=length}END{print i}'

使用trwc

tr -C -d "A-Za-z" | wc -c

他们都删除了A-Za-z范围内的所有字符,然后计算剩余的字符数。 tr具有依赖于您的语言环境的优点或缺点。

您也可以像创建shell脚本一样创建awk脚本。

#!/usr/bin/awk
    { gsub("[^A-Za-z]", ""); i+=length }
END { print i }

为了获得最大的可移植性,您需要将脚本中的区域设置设置为POSIX,或列出每个字符。

tr -C -d "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" | wc -c

答案 1 :(得分:0)

听起来这可能是你想要的(使用GNU awk进行多字符RS)

awk -v RS='[[:alpha:]]' 'END{print (NR?NR-1:0)}' file

e.g:

$ cat file
a
    b,c
  d3e
$ awk -v RS='[[:alpha:]]' 'END{print (NR?NR-1:0)}' file
5