• awk处理之案例四:sort加awk来过滤文本


    编译环境

       本系列文章所提供的算法均在以下环境下编译通过。

    【脚本编译环境】Federa 8,linux 2.6.35.6-45.fc14.i686
    【处理器】 Intel(R) Core(TM)2 Quad CPU Q9400 @ 2.66GHz
    【内存】 2025272 kB

    前言

        awk是脚本中出色的文本处理工具。源码好像也是用C语言写的。本系列会针对不同的案例,用awk来解决我们所要的问题。 为什么会用awk呢?我们当然可以使用C语言或者java语言来对文本 做处理,但每次都要编译会令人发疯的。修改起来也麻烦,正所谓杀鸡焉用牛刀。 而脚本的灵活便捷使得工作变得更加轻松容易。在shell脚本编程中,awk堪称瑞士军刀绝不为过。

        本系列文章均系笔者所写,难免有一些错误或者纰漏,如果小伙伴们有好的建议或者更好的算法,请不吝赐教。

    正文

    【场景】

       我有这样一堆数据,这个模式大约3w条
    我希望判断出第二个域内重复的选项。然后重复的选项比较第四个域的大小,取出小的输出第一个域,如果相同比较第三个域的大小,同样取出小的输出第一个域,若还是相同则输出第一个,这个该如何写脚本或者awk判断?

       a.txt文本内容如下:

    11        elex337_u000014        9        0
    12        elex337_Golden214        14        0
    14        elex337_u000017        9        0
    15        elex337_u000019        11        0
    16        elex337_u000020        9        0
    17        elex337_Lokio        9        0
    18        elex337_u000022        19        0
    19        elex337_u000023        11        0
    20        elex337_u000024        14        0
    21        elex337_swordas15        9        0
    22        elex337_Koann        19        0
    23        elex337_Vylex        26        0
    24        elex337_u000028        19        0
    25        elex337_u000014        1        0
    26        elex337_Golden214        35        1
    27        elex337_u000016        0        0
    28        elex337_u000017        22        0
    29        elex337_u000019        10        0
    30        elex337_u000020        11        0
    31        elex337_Lokio        9        0
    32        elex337_u000022        9        0
    33        elex337_u000023        32        0
    34        elex337_u000024        9        0
    35        elex337_swordas15        22        0
    36        elex337_Koann        11        0
    37        elex337_Vylex        22        0
    39        elex337_u000042        11        0
    40        elex337_u000043        10        0

       提取完之后,c.txt文本内容如下:

    12        elex337_Golden214        14        0
    36        elex337_Koann        11        0
    17        elex337_Lokio        9        0
    21        elex337_swordas15        9        0
    25        elex337_u000014        1        0
    27        elex337_u000016        0        0
    14        elex337_u000017        9        0
    29        elex337_u000019        10        0
    16        elex337_u000020        9        0
    32        elex337_u000022        9        0
    19        elex337_u000023        11        0
    34        elex337_u000024        9        0
    24        elex337_u000028        19        0
    39        elex337_u000042        11        0
    40        elex337_u000043        10        0
    37        elex337_Vylex        22        0

    【代码】

    sort -k2,2 -k4,4n -k3,3n -k1,1n < infile |awk '!a[$2]++'

    【解释】

       sort是linux上一个十分强大排序工具。其用法是sort [options][(files)],因为这里只用到字段排序,故就讲一下字段排序的功能。

    排序键值字段的类型
    字母 说明
    b 忽略开头的空白
    d 字典顺序
    f 不区分字幕的大小写
    g 以一般的符点数字进行比较,只适合用户GNU版本
    i 忽略无法打印的字符
    n 以整数数字比较
    r 倒置排序的顺序

       -km.n表示从第m个字段的第n个字符开始比较。

       awk '!a[$2]++{print}' 是过滤掉重复的。

    作者

       出处:http://www.cnblogs.com/gina

       本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    C# 系统应用之通过注册表获取USB使用记录(一)
    web项目测试方法总结
    C#面向对象编程实例-猜拳游戏
    c#基础这些你都看过吗?(一)-----仅供初学者使用
    .NET事件监听机制的局限与扩展
    SQL代码
    泛型接口委托
    存储过程
    小操作
    DataGridView
  • 原文地址:https://www.cnblogs.com/gina/p/3248110.html
Copyright © 2020-2023  润新知