2

我正在尝试制作一个可执行文件,它将接收任意数量的文本文件并给出一个输出,即单词按出现次数的分布。这将在 bash 脚本中完成,到目前为止我所拥有的是:

#!/bin/bash
y=$(cat $* | wc -w)

cat $* | tr ' ' '//' |  tr '[:upper:]' '[:lower:]' | tr -d '[:punct:]' | 
grep -v '[^a-z]'| sort | uniq -c | sort -rn | head -$y

我在尝试设置时遇到错误y,我无法弄清楚如何head打印出每个单词。

有没有更好的打印方法?

4

1 回答 1

1

为什么要跑head呢?无法保证文件中的字数会与字数一样多;实际上,几乎可以保证不会有(因为会有一些重复的单词)。如果要查看所有数据,则显示所有数据;不要过滤来自sort -nr.

第一个tr只需要一个斜线,我想。通常,您会将空格和标点符号映射到换行符(可以-s选择tr将相邻的换行符压缩为一个)。第一个中的斜线tr算作第三个中的标点符号tr,所以你在那儿并不明显。我想我希望看到类似的东西:

cat "$@" |
tr -cs '[:alpha:]' '\n' |      # Convert any non-alpha character to newline
tr '[:upper:]' '[:lower:]' |   # Case-convert to lower case
sort | uniq -c | sort -nr

注意使用"$@"而不是$*; 当您指定的文件名不包含空格(换行符、制表符等)时,没有区别;当他们这样做时,"$@"表格是正确的,$*而不是正确的,所以你最好总是使用"$@". 它的正确性远比它的正确性要高得多$*

对于我周围的一些 C 源代码,脚本的输出是:

 246 n
 217 i
 153 int
 141 list
 124 if
 118 t
 103 char
  99 a
  97 size
  90 buffer
  89 context
  82 d
  81 void
  79 include
  79 h
  78 s
  65 for
  62 j
  55 ptr
  54 r
  54 const
  53 static
  53 sem
  51 pthread
  49 z
  49 oldneedle
  49 err
  47 to
  47 return
  46 mutex
  44 printf
  43 error
  43 c

请注意,“h”这个词出现的频率与“include”这个词一样频繁;这是有原因的!该词t出现很多,但这是因为,例如,size_t被过滤视为两个词。可以保留下划线;更改第一个tr使用'[:alpha:]_'(注意下划线)。您消除了数字,但如果您愿意,您也可以保留这些数字。

于 2013-02-06T23:36:32.710 回答