这是我另一篇文章的后续:打印文本文件中的所有回文
我希望能够打印出我从文本文件中找到的类似于频率表的回文数量。它将显示单词后面的单词数量,类似于以下格式:
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
。