1

好的,所以我需要创建一个命令,在一个文本块中列出任何给定文件中最常用的 100 个单词。我目前拥有的:

$ alias words='tr " " "\012" <hamlet.txt | sort -n | uniq -c | sort -r | head -n 10'

输出

$ words
     14 the
     14 of
      8 to
      7 and
      5 To
      5 The
      5 And
      5 a
      4 we
      4 that

我需要它以以下格式输出:

the of to and To The And a we that

(((在那张纸条上,我将如何告诉它以全部大写形式打印输出?))

而且我需要对其进行更改,以便可以将“单词”通过管道传输到任何文件,因此初始输入将命名文件,而不是在管道中指定文件,而管道将完成其余的工作。

4

1 回答 1

1

好的,一点一点地拿你的观点,虽然不一定按顺序。


words您只需删除该<hamlet.txt位即可更改为使用标准输入,因为tr默认情况下将从标准输入中获取其输入。然后,如果要处理特定文件,请使用:

cat hamlet.txt | words

或者:

words <hamlet.txt

您可以通过制作管道的第一部分来消除大写字母的影响:

tr '[A-Z]' '[a-z]'

这将在做任何其他事情之前将您的输入小写。


最后,如果您采用整个管道(使用上面建议的修改),然后将其传递给更多命令:

| awk '{printf "%s ", $2}END{print ""}'

这将打印每行(单词)的第二个参数,后跟一个空格,然后打印一个空字符串,最后以换行符结尾。


例如,以下脚本words.sh将为您提供所需的内容:

tr '[A-Z]' '[a-z]' | tr ' ' '\012' | sort -n | uniq -c | sort -r
    | head -n 3 | awk '{printf "%s ", $2}END{print ""}'

(单行:为了便于阅读,我将其拆分)根据以下成绩单:

pax> echo One Two two Three three three Four four four four | ./words.sh
four three two 

您可以使用以下别名实现相同的目的:

alias words="tr '[A-Z]' '[a-z]' | tr ' ' '\012' | sort -n | uniq -c | sort -r
    | head -n 3 | awk '{printf \"%s \", \$2}END{print \"\"}'"

(再次,一行)但是,当事情变得如此复杂时,我更喜欢脚本,如果只是为了避免无休止的转义字符:-)

于 2012-05-19T13:55:02.273 回答