使用tcl计算文件中的特定字数

使用tcl计算文件中的特定字数,tcl,Tcl,我有一个文件,其中的内容按以下顺序排列: This is not right Right statement it is This is incorrect Give right expression 如何使用tcl脚本查找单词“right”的计数?因为它不在列表中,所以我无法将这些语句统一起来并接受表达式。 哪些命令适合使用lsort或regexp?假设文本在文件“myfile.txt”中,我们可以将文本复制到text变量中: set f [open myfile.txt] set text

我有一个文件,其中的内容按以下顺序排列:

This is not right
Right statement it is
This is incorrect
Give right expression
如何使用tcl脚本查找单词“right”的计数?因为它不在列表中,所以我无法将这些语句统一起来并接受表达式。
哪些命令适合使用lsort或regexp?

假设文本在文件“myfile.txt”中,我们可以将文本复制到
text
变量中:

set f [open myfile.txt]
set text [read $f]
# => This is not right
# => Right statement it is
# => This is incorrect
# => Give right expression
close $f
对忽略大小写的所有匹配项的内联搜索提供了一个我们可以计数的单词列表:

llength [regexp -inline -all -nocase right $text]
# => 3
llength [regexp -inline -all -nocase this $text]
# => 2
(这是正确的:文本中有三个“正确”和两个“这个”。)

这与我们实际上对单词列表不感兴趣一样,只是单词的数量:

regexp -all -nocase this $text
当这些简单的正则表达式中没有一个单词出现在其他单词中时,例如“bright”中的“right”或“this”中的“this”。如果可能出现这种误报,则正则表达式需要更加复杂
\m
\m
约束可分别用于标记单词的开头和结尾:

regexp -all -nocase {\mright\M} $text
这将匹配“正确”,但不匹配“明亮”或“明快”

计算文本中每个单词频率的另一种方法是使用字典结构:

set words {}
foreach word [split [string tolower $text]] {
    dict incr words $word
}
现在,我们可以查询单个单词的频率结构:

dict get $words right
# => 3
dict get $words this
# => 2
或者查看频率表:

set words
# => this 2 is 3 not 1 right 3 statement 1 it 1 incorrect 1 give 1 expression 1
更新句子中最后一个单词的单词频率

你写的是“声明”,但我猜你的意思是“句子”。如果这是错误的,你需要告诉我如何识别语句的结尾

将句子末尾的单词定义为一系列非空白字符,后跟文字句点字符,这些单词的频率可以如下计算:

set words {}
foreach word [regexp -inline -all {\S+(?=\.)} [string tolower $text]] {
    dict incr words $word
}
然后按上述步骤进行

文件: , , , , , , , , , ,

假设文本在文件“myfile.txt”中,我们可以将文本复制到
text
变量中:

set f [open myfile.txt]
set text [read $f]
# => This is not right
# => Right statement it is
# => This is incorrect
# => Give right expression
close $f
对忽略大小写的所有匹配项的内联搜索提供了一个我们可以计数的单词列表:

llength [regexp -inline -all -nocase right $text]
# => 3
llength [regexp -inline -all -nocase this $text]
# => 2
(这是正确的:文本中有三个“正确”和两个“这个”。)

这与我们实际上对单词列表不感兴趣一样,只是单词的数量:

regexp -all -nocase this $text
当这些简单的正则表达式中没有一个单词出现在其他单词中时,例如“bright”中的“right”或“this”中的“this”。如果可能出现这种误报,则正则表达式需要更加复杂
\m
\m
约束可分别用于标记单词的开头和结尾:

regexp -all -nocase {\mright\M} $text
这将匹配“正确”,但不匹配“明亮”或“明快”

计算文本中每个单词频率的另一种方法是使用字典结构:

set words {}
foreach word [split [string tolower $text]] {
    dict incr words $word
}
现在,我们可以查询单个单词的频率结构:

dict get $words right
# => 3
dict get $words this
# => 2
或者查看频率表:

set words
# => this 2 is 3 not 1 right 3 statement 1 it 1 incorrect 1 give 1 expression 1
更新句子中最后一个单词的词频

你写的是“声明”,但我猜你的意思是“句子”。如果这是错误的,你需要告诉我如何识别语句的结尾

将句子末尾的单词定义为一系列非空白字符,后跟文字句点字符,这些单词的频率可以如下计算:

set words {}
foreach word [regexp -inline -all {\S+(?=\.)} [string tolower $text]] {
    dict incr words $word
}
然后按上述步骤进行

文件: , , , , , , , , , ,

这不是正确的陈述\n这是不正确的\n给出正确的表达\n\n表示下一行,即我有这5行,其中有单词“right”,我想搜索重复的单词及其数量。我还需要知道另一个单词“This”。我希望o/p如下:右:5和此:3这是不正确的陈述\n这是不正确的\n给出正确的表达\n\n表示下一行,即我有这5行,其中有单词“right”,我想搜索重复的单词和它们的数量。我还需要知道另一个单词“这个" . 我希望o/p如下:对:5,这个:3我得到的答案是0。@johnny:我现在已经测试过了,它对我有效。您是否已将文本放入文本变量中?您可以使用
regexp-all
来计算匹配数。还有,当面对Jonny Mathis这个短语时会发生什么呢?这个短语非常好。?@Peter Lewerin:现在可以了,但我的问题更一般。我有不同的重复单词和超过一千行在我的文件。我的目标是找出重复的单词,但我不知道确切的数字。有没有可能找出所有那些不断重复的单词及其数量:例如,我希望所有单词都在语句的末尾,并且它们的数量count@johnny:没有完全通用的解决方案。到目前为止,我提出的三种解决方案(包括更新中的一种)在不同的约束条件下解决了这个问题(单词是已知的,每个单词都要计数,只有结尾的单词或句子要计数)。每次问题描述改变时,解决方案也需要改变。也许你可以从这里给出的例子中推断出来?我得到的答案是0。@johnny:我现在已经测试过了,它对我有效。您是否已将文本放入文本变量中?您可以使用
regexp-all
来计算匹配数。还有,当面对Jonny Mathis这个短语时会发生什么呢?这个短语非常好。?@Peter Lewerin:现在可以了,但我的问题更一般。我有不同的重复单词和超过一千行在我的文件。我的目标是找出重复的单词,但我不知道确切的数字。有没有可能找出所有那些不断重复的单词及其数量:例如,我希望所有单词都在语句的末尾,并且它们的数量count@johnny:没有完全通用的解决方案。到目前为止,我提出的三个解决方案(包括更新中的一个)解决了公关问题