【问题标题】:Calculating the length of a text in UNIX在 UNIX 中计算文本的长度
【发布时间】:2014-11-06 19:54:12
【问题描述】:

我有两个问题:

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:命令。第 17 行:长度++ awk:命令。第 17 行:^ 意外的换行符或字符串结尾

请至少帮助我解决第二个问题。我只是没有什么问题,一切似乎都很好。先谢谢了!

【问题讨论】:

  • 否定字符类是 [^a-z] 不是 ![a-z]。此外,您不需要多次调用gsub,因为空格、数字和标点符号都是“非字母”。
  • 另外,您可以使用length()函数来代替计算剩余字母的数量。
  • 您的字面意思是“英文字母”还是“字母字符”?尽管它们在用英语编写的文本中可能相同,但总体上可能存在很大差异,并且 awk 不支持前 AFAIK。

标签: linux unix awk


【解决方案1】:

使用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

【讨论】:

  • A-Za-z 在某些语言环境中可以包含非字母,请改用 [:alpha:]。 gsub() 的第一个 arg 也是一个 RE,因此请使用 RE 分隔符而不是字符串分隔符,除非您正在与变量进行字符串连接或有其他一些非常具体的需要并理解注意事项..
  • @EdMorton [:alpha:] 可以匹配非英文字符,原始问题只想计算英文字母。最便携的方法可能是列出所有字母ABCD..Zabc..wxyz
  • 关于 [:alpha:] 与英文字母的更正,我在 OPs 问题下的评论中提到了这个问题。是的,如果 OP 确实只需要英文字母但正确设置区域设置应该可以正常工作,则可能需要列出单个字母。
【解决方案2】:

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

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

例如:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-20
    • 2011-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多