获取所有单词的文本文件单词出现次数并按打印输出排序


28

我有一个可以处理文本文件的命令,可以计算单词的所有出现次数,并像这样打印出来:

user@box $˜ magic-command-i-forgot | with grep | and awk | sort ./textfile.txt
66: the
54: and
32: I
16: unix
12: bash
5:  internet
3:  sh
1: GNU/Linux

因此,它不是逐行搜索,而是逐词搜索,并且它针对所有单词(不仅针对1个单词)进行搜索。我很久以前在互联网上的某个地方找到了它,但我找不到或记住它。

Answers:


33

我会使用tr而不是awk

echo "Lorem ipsum dolor sit sit amet et cetera." | tr '[:space:]' '[\n*]' | grep -v "^\s*$" | sort | uniq -c | sort -bnr
  • tr 只是用换行符替换空格
  • grep -v "^\s*$" 修剪空行
  • sort 准备作为输入 uniq
  • uniq -c 计算发生次数
  • sort -bnr 忽略空格时以数字相反的顺序排序

哇。事实证明,这是计算每线发誓的好命令

找 。-name“ * .py” -exec cat {} \; | tr'[:space:]''[\ n *]'| grep -v“ ^ \ s * $” | 排序| uniq -c | 排序-bnr | grep他妈的


可能要使用它tr -s来处理多个空间,尤其是在遇到缩进时。
Arcege 2012年

@Arcege:好点。尽管它不会改变结果,但可能会稍微固定脚本。
seler 2012年

-g--general-numeric-sort)选项sort在某些情况下可能更可取。例如,sort -n将保持10\n1 4原样,将1 4视为14,而sort -g将正确地将其视为1 4\n10
Skippy le Grand Gourou 2015年

不错的命令,真的值得投票:)
Noor 2015年

@seler我认为您可以使grep和tr部分更加简单,如下所示:echo "Lorem ipsum dolor sit sit amet et cetera." | tr ' ' '\n' | grep -v "^$" | sort | uniq -c | sort -bnr请注意,我是初学者,所以我可能是错的,请随时提出建议。
smc

8
  1. 将输入分成单词,每行一个。
  2. 对所得的单词(行)列表进行排序。
  3. 压扁多个事件。
  4. 按出现次数排序。

要将输入拆分为单词,请用换行符替换您认为是单词分隔符的任何字符。

<input_file \
tr -sc '[:alpha:]' '[\n*]' | # Add digits, -, ', ... if you consider
                             # them word constituents
sort |
uniq -c |
sort -nr

这是一个很好的答案,因为它可以处理单词紧邻您要忽略的某些非单词标点符号的情况。
David Grayson

5

不使用grep和awk,但这似乎可以满足您的要求:

for w in `cat maxwell.txt`; do echo $w; done|sort|uniq -c
  2 a
  1 A
  1 an
  1 command
  1 considered
  1 domain-specific
  1 for
  1 interpreter,
  2 is
  1 language.
  1 line
  1 of

1
如果输入包含外壳通配符(您需要添加set -f),并且将标点符号视为单词的一部分(将标点符号添加到单词中会难于解决IFS-祝您支持非ASCII字符集,这很麻烦),则此方法将无效。对于非常大的输入文件,这将是不好的,因为它将整个文件存储在内存中(sort更智能)。
吉尔斯(Gillles)“所以-别再作恶了”

2

我相信您正在追寻这样的事情?

$ perl -n -e 'foreach ${k} (split(/\s+/)){++$h{$k}};END{foreach $l (keys(%h)){print "$h{$l}: ${l}\n"}}' /path/to/your/file | sort -n -k 1

当然,您也可以这样做awk:)



0
file=/home/stefan/ooxml1.txt
for word in $(sed 's/[^A-Za-z]/ /g' $file | tr " " "\n" | sort -u)
do
  echo -n "$word "
  grep -c $word $file
done | sort -k2 -n 

将文件拆分为单词后,升序排序。

简单的grep将fish在中找到fisheye,因此您必须增强grep命令以防止部分匹配。

在传统的HDD(IDE)时代,一台机器上的25k文本文件大约需要3s。

对于较大的文件或经常执行的操作,使用哈希映射方法会更好,但是对于很少运行的作业或仅较小的文件,这可能就足够了。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.