Bash - 从文本文件

时间:2017-11-04 20:47:36

标签: bash palindrome

这是我的另一篇文章的后续内容: 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

非常感谢您的解决方案!如果存在需要其他命令的解决方案,也非常感谢其他命令背后的推理。

谢谢

1 个答案:

答案 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