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 @   wztshine  阅读(303)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示