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
posted @ 2020-10-13 10:35  wztshine  阅读(299)  评论(0编辑  收藏  举报