Bash-统计文本文件中回文的频率



这是我另一篇文章的后续:打印文本文件中的所有回文

我希望能够打印出我从文本文件中找到的类似于频率表的回文数量。它将显示单词后面的单词数量,类似于以下格式:

100  did
32   sas
17   madam

我现在的代码是:

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

与我上一篇文章相比:从文本文件中打印所有回文。我添加了"sort-n"one_answers"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

这个文件只是为了在一个更大的文件上尝试这个脚本之前进行测试,在这个文件中需要更长的时间。

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

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,}' "$1" | tr '[:upper:]' '[:lower:]' | while read -r word; do
[[ $word == $(rev <<< "$word") ]] && echo "$word"
done | sort | uniq -c

最后为了得到按计数降序排列的输出,您需要进一步将输出管道传输到sort -nr

最新更新