Bash - 计算文本文件中回文的出现频率

Bash - Count frequency of palindromes from text file

这是我的另一个 post 的跟进:

我希望能够打印出我从我的文本文件中找到的回文数与频率 table 相似的数量。它会显示单词后跟单词的数量,类似于这种格式:

100  did
32   sas
17   madam

我现在的代码是:

#!usr/bin/env bash

function search
{
    grep -oiE '[a-z]{3,}' "" | sort -n | tr '[:upper:]' '[:lower:]' | while read -r word; do
        [[ $word == $(rev <<< "$word") ]] && echo "$word" | uniq -c
    done
}
search ""

与上一个 post 相比,我做了:。我添加了 "sort -n" 和 "uniq -c" 据我所知是按字母顺序对找到的回文进行排序,然后 "uniq -c" 是打印找到的单词的出现次数。

只是为了测试脚本,我有一个名为:"testingfile.txt" 的测试文件。这包含:

testing words testing words testing words 
palindromes
Sas
Sas
Sas
sas
bob
Sas
Sas
Sas Sas madam
midim poop goog tot sas did i want to go to the movies did
otuikkiuto

pop
poop

这个文件只是为了让我可以在对一个更大的文件尝试这个脚本之前进行测试,在这个文件中它会花费更长的时间。

在控制台中输入时:(还要注意 "palindrome" 是我脚本的名称)

source palindrome testingfile.txt

输出如下所示:

1 bob
1 did
1 did
1 goog
1 madam
1 midim
1 otuikkiuto
1 poop
1 poop
1 pop
1 sas
1 sas
1 sas
1 sas
1 sas
1 sas
1 sas
1 sas
1 sas
1 tot

为了获得我想要的结果,我是否缺少某些东西:

9 sas
2 did
2 poop
1 bob
1 goog
1 madam
1 midim
1 otuikkiuto
1 pop
1 tot

对此问题的解决方案将不胜感激!如果需要其他命令的解决方案,也非常感谢对其他命令背后的推理的解释。

谢谢

您错过了两个重要的细节:

  • 您需要将所有输入一次传递给uniq -c来计算它们,而不是一一对应uniq每个
  • uniq 期望它的输入被排序。 grep 管道中的 sort 无效,因为转换为小写后,这些值需要重新排序

您可以将 sort | uniq -c 应用于整个循环的输出, 通过管道循环本身:

grep -oiE '[a-z]{3,}' "" | tr '[:upper:]' '[:lower:]' | while read -r word; do
    [[ $word == $(rev <<< "$word") ]] && echo "$word"
done | sort | uniq -c

最后,要获得按计数降序排序的输出, 您需要进一步将输出通过管道传输到 sort -nr.