zoukankan      html  css  js  c++  java
  • 一天一个shell实例(1)文本中n个出现频率最高的单词(转)

    写一个文本处理程序,查找文本中n个出现频率最高的单词,输出的结果需要显示这些单词出现的次数,并按照次数从大到小排序。

    把问题分成六个步骤:

    1,将文本以一行一个单词的形式显示出来

    2,将大写字母转换成小写

    3,对单词进行排序

    4,对排序好的单词列表统计每个单词出现的次数

    5,按照出现的次数排序

    6,显示单词列表的前n行

    脚本的代码如下:

    #topn.sh脚本

    #!/bin/bash

    end=$1     #1

    cat $2 |      #2

    tr -cs "[a-z][A-Z]" "[\012*]" |      #3

    tr A-Z a-z |      #4

    sort |      #5

    uniq -c |      #6

    sort -k1nr -k2 |       #7

    head -n"$end"       #8

    #1:$1为第一个参数,表示输出频率最高的行数

    #2:$2为第二个参数,表示目标文本,使用cat把目标文本输入管道,|为管道符

    #3:tr命令的-c选项用于选定不在”[a-z][A-Z]”字符集内的字符,tr命令将选定的字符转换成换行符,\012是换行符的八进制码,*表示将换行符任意扩展,使其等于被替换的字符集个数,这样就将所有非字母的符号转换为换行符,从而将文本文件以一行一个单词的形式显示出来。-s删除所有重复出现的字符序列,只保留一个。最后把得到的结果输入管道。

    #4:tr把大写字母转化成小写字母

    #5:把分好的单词进行排序

    #6:uniq对排序好的单词列表统计每个单词出现的次数,并删除相邻重复行,-c 在输出行前面加上每行在输入文件中出现的次数。 这样就得到了出现的频率及其对应的单词。

    #7:用sort按照出现的频率从大大小排序,频率相同的按照字母排序。-k1表示按照第一域进行排序,-k2为按照第二域进行排序,先按照第一域排序如果第一域相等再按照第二域排序,-n表示数字,-r表示从大到小排序

    #8:head 输出前n行

    输出结果:

    root@lNotebook-PC:/home/lwx/myshelltest# ./topn.sh 5 test .txt
    13 qwe
    12 qw
    11 eqw
    8 sdf
    7 we 
  • 相关阅读:
    *Server对象的URLEncode方法的详细介绍 *
    *Server对象的方法简单介绍*
    *SQLDB中图片的读取并显示*
    *关于DataBinder.Eval*
    SQLMaps 的基本思想
    *DropdownList的数据绑定*
    面向对象的一些思想
    [zz]NoSQL对比:Cassandra vs MongoDB vs CouchDB vs Redis vs Riak vs HBase vs Membase vs Neo4j
    [zz]HDFS文件读写 使用c api
    [zz]linux patch 简单使用速查
  • 原文地址:https://www.cnblogs.com/xingmeng/p/3030294.html
Copyright © 2011-2022 走看看