使用AWK进行字数统计

时间:2015-02-20 12:10:17

标签: awk

我的文件如下:

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

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]}'

3 个答案:

答案 0 :(得分:8)

它适用于我:

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

PS你不需要设置-F" ",因为它的默认值是空白的 PS2,不要将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

答案 1 :(得分:2)

使用带有多字符RS( R ecord S eparator)定义支持的gawk,而不是循环每一行并将单词保存在数组({for(i=1;i<=NF;i++) a[$i]++})中选项并保存在数组中的每个字段如下(它有点快):

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-character-class [[:space:]]+(包括一个或多个空格或\n ew line character)定义为记录分隔符。

答案 2 :(得分:-1)

这是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}都会打印