这是我的另一篇文章的后续内容: Printing all palindromes from text file
我希望能够打印出我在文本文件中找到的与频率表类似的回文量。它会显示单词后跟单词的数量,类似于以下格式:
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"
与我上次发表的帖子相比:Printing all palindromes from text file。我添加了“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
非常感谢您的解决方案!如果存在需要其他命令的解决方案,也非常感谢其他命令背后的推理。
谢谢
答案 0 :(得分:2)
您错过了两个重要细节:
uniq -c
进行计数,而不是逐个uniq
uniq
期望对其输入进行排序。您在sort
管道中的grep
无效,因为在转换为小写后,值需要再次排序您可以将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
。