shell awk 统计文件词频
现有文件file,如何统计输出file中每个单词的词频,并按照词频排序?
awk -F '[:/]' '{ for(a=1;a<=NF;a++) {if($a in array) array[$a]++ ;else if(length($a)!=0) array[$a]=1; }} END{for(aa in array) printf "%-10s %s\n", aa,array[aa]} ' file | sort -t ' ' -nr -k2
各参数含义:
awk -F '[ '']+' '{ # -F命令自定义分隔符,此处使用正则表达式
for(a=1;a<=NF;a++) { # NF为每行分割后的字段数,遍历这些字段
if($a in array) # 如果字段在array数组中(可以放键值对)键为单词,值为词频
array[$a]++ ; # 数组的值 +1
else if(length($a)!=0) # 如果字段长度不为0,也不再数组中
array[$a]=1; # 值为1
}
}
END{ # END命令在处理完最后一行后才执行
for(aa in array) # 遍历数组
print aa,array[aa]} ' # 打印键,值
words.txt | sort -t ' ' -nr -k2 # 管道命令进行sort排序;-t自定义分隔符,-n按照数字类型排序,-r反序,-k2:用字段2排序
现有文件:a.txt,如何只输出[host]下的所有属性?
[name]
aaa
bbb
ccc
[path]
lasf
lasdf
lsioe
[host]
192.1681.11
29u342.2348
293
[title]
lasod
lasjdoife
lksjfoe
$ awk 'BEGIN{ex=0} {if(/\[host\]/){ ex=1; print $0;} else if(ex==1 && !/\[.*\]/) print $0; else ex=0;}' a.txt
[host]
192.1681.11
29u342.2348
293