我有一个命令可以处理一个文本文件,计算所有出现的单词并将其打印出来,如下所示:
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 个单词。我很久以前在互联网上的某个地方找到过它,但我找不到或不记得它。
答案1
我会用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 '[:空格:]' '[\n*]' | grep -v "^\s*$" | grep -v "^\s*$" |排序| uniq-c|排序-bnr | grep 他妈的
答案2
- 将输入拆分为单词,每行一个。
- 对生成的单词(行)列表进行排序。
- 挤压多次出现。
- 按出现次数排序。
要将输入拆分成单词,请用换行符替换您认为是单词分隔符的任何字符。
<input_file \
tr -sc '[:alpha:]' '[\n*]' | # Add digits, -, ', ... if you consider
# them word constituents
sort |
uniq -c |
sort -nr
答案3
不使用 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
答案4
我相信你正在追求这样的东西?
$ 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
当然你也可以做同样的事情:)