我的文件如下:
这是一个示例文件 该文件将用于测试
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]}'
答案 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}
都会打印