使用AWK计算单词数量

6

我有一个像下面这样的文件:

这是一个示例文件 此文件将用于测试

this is a sample file
this file will be used for testing

我希望使用AWK来统计单词数。
预期输出如下:
this 2
is 1
a 1
sample 1
file 2
will 1
be 1
used 1
for 1

我已经写了下面的 AWK,但是遇到了一些错误。
cat anyfile.txt|awk -F" "'{for(i=1;i<=NF;i++) a[$i]++} END {for(k in a) print k,a[k]}'

2
你具体遇到了哪些错误? - Tom Fenech
你的文件中可以包含标点符号(. , ' ? ! -等)吗? - Ed Morton
@EdMorton 我现在明白你为什么问这个问题了。我尝试了带有标点符号的文本,它将thisthis?this,列为不同的单词。我该如何修复这个问题,使其跳过标点符号? - undefined
@zeynel 请提出一个新问题。 - undefined
@EdMorton 我在这里找到了答案 https://stackoverflow.com/questions/48677997/how-to-remove-punctuation-marks-using-awk - undefined
3个回答

12

对我而言,它可以良好运行:

awk '{for(i=1;i<=NF;i++) a[$i]++} END {for(k in a) print k,a[k]}' testfile
used 1
this 2
be 1
a 1
for 1
testing 1
file 2
will 1
sample 1
is 1

注意:无需设置-F" ",因为它默认为空格。
注意2:不要在能够自己读取数据的程序中使用cat,如awk

您可以在代码后面添加sort以对其进行排序。

awk '{for(i=1;i<=NF;i++) a[$i]++} END {for(k in a) print k,a[k]}' testfile | sort -k 2 -n
a 1
be 1
for 1
is 1
sample 1
testing 1
used 1
will 1
file 2
this 2

删除字段分隔符选项后,它可以正常工作。但是我不明白-F" "引起了什么问题?你能帮我理解一下吗? - Koushik Chandra
我猜测在你的原始输入中,在两列之间有不同数量或类型的空格字符。awk 的默认行为是使用一个或多个任何类型的空格,而你指定了只有一个空格。 - Tom Fenech
1
@TomFenech 指定单个空格对 awk 来说没有任何影响,因为这是 FS 的默认值,只是在内部,awk 在 FS 是单个空格时会表现得“特殊”。如果要使用字面上的单个空格,则需要 FS="[ ]" - Ed Morton

2

不要循环每一行并将单词保存在数组中({for(i=1;i<=NF;i++) a[$i]++}),而是使用支持多字符记录分隔符(RS)定义选项的gawk,并将每个字段保存在数组中,如下所示(速度更快):

gawk '{a[$0]++} END{for (k in a) print k,a[k]}' RS='[[:space:]]+' file

输出:

used 1
this 2
be 1
a 1
for 1
testing 1
file 2
will 1
sample 1
is 1

在上述gawk命令中,我定义了空格字符类[[:space:]]+(包括一个或多个空格或者换行符\n)作为记录分隔符。

好主意,但您应该说明它是针对gawk特定的,因为它使用了多字符RS,并且您应该使用RS ='[[:space:]]+'而不是硬编码这两个空格字符。 - Ed Morton
1
不用谢。你不需要使用 |\n,因为 [[:space:]] 包括所有的空格字符,包括 \n - Ed Morton
1
更新了。再次感谢。如果我漏掉了其他内容,请随意改进 :) - αғsнιη

0

这里是Perl代码,提供类似于Jotne的awk解决方案的排序输出:

perl -ne 'for (split /\s+/, $_){ $w{$_}++ }; END{ for $key (sort keys %w) { print "$key $w{$key}\n"}}' testfile

$_ 是当前行,基于空格/\s+/进行分割
然后将每个单词放入$_
%w哈希存储每个单词出现的次数
在整个文件处理完毕后,运行END{}
%w哈希的键进行字母表顺序排序
打印每个单词$key和出现次数$w{$key}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接