7

我一直在阅读 Linux 的食谱以掌握它。我对它很陌生。

我遇到了一个名为 Concordance of text 的主题。现在我明白了它是什么,但我无法使用 tr、sort 和 uniq 获得一系列命令(这就是食谱所说的),这些命令会产生一致性。

有人能告诉我如何创建一个基本的索引吗?即只是排序和显示每个唯一词的词频。

食谱中提出的想法是使用 tr 将所有空格转换为换行符,以便每个单词进入一个新行,然后将其传递给排序器,然后使用 -c 标志传递给 uniq 以计数独特的条款。

我无法弄清楚正确的参数。有人可以在解释每个参数的作用时解释一下吗?

我已经为此进行了谷歌搜索,但我无法为我的问题找到明确的答案。

任何帮助深表感谢!

4

2 回答 2

1

有很多方法可以做到这一点,但这是我的解决方案。它使用的命令与您提到的不同,但是通过使用sed和最终的排序,它可能会产生更理想的输出。

find . -type f -print0 | xargs -0 cat | sed 's/[[:punct:]]//g' | sed -r 's/\s+/\n/g' | sort | uniq -c | sort -n

find . -type f -print0将从当前目录向下递归搜索所有文件夹和文件。-type f将只返回文件。-print0将使用特殊\0字符来结束文件名,以便空格不会与管道中的下一个命令混淆。

xargs接受输入并将其转换为命令的参数,在本例中为cat. cat将打印作为参数提供给它的所有文件的内容。告诉 xargs 它的-0输入由特殊\0字符而不是空格分隔。

sed是一个模式匹配流编辑器。第一个sed命令使用该模式替换( s) 所有标点符号,并用任何内容替换标点符号。[[:punct:]]它匹配给定给它的每一行中的所有此类模式(g)。

第二个 sed 命令通过输入字符串 ( ) 将一行中 1 个或多个空格 ( \s+) 的所有实例转换为换行符 ( )。\ng

sort按字母顺序组织单词。

uniq -c消除输出列表中的相邻重复项,同时计算有多少。

sort -n对这个输出进行数字排序,产生一个按词频排序的词列表。

sed并且xargs是非常强大的命令,尤其是在结合使用时。但是,正如另一位海报所指出的那样,find它也具有几乎不受约束的力量。tr很有用,但比sed.

于 2012-03-11T17:06:32.473 回答
0
tr ' ' '\n' <input | sort | uniq -c

如果我正确理解您的评论,您需要目录中所有文件的所有单词的总数。你可以这样做:

find mydir -type f -exec cat {} + | tr ' ' '\n' | sort | uniq -c

find将递归搜索mydir与其参数匹配的文件:-type f告诉它只保留普通文件(而不是目录或您不必担心的其他几种类型),然后find将执行cat,将所有文件名作为参数提供给它; cat连接文件,打印所有内容,就好像它是一个大文件一样。然后该输出通过相同的tr//管道来实际计算一致性sortuniq

于 2012-01-29T21:19:16.963 回答