美文网首页
【技术案例】跟老男孩学运维-awk项目案例

【技术案例】跟老男孩学运维-awk项目案例

作者: 李导996 | 来源:发表于2021-05-26 17:48 被阅读0次

    一个awk数组应用案例

    [TOC]

    0.技术点:

    • awk
    • awk数组
    • awk判断
    • awk数组赋值
    • awk函数split

    1.详细需求

    有如下文本内容:完成如下所有需求:

    • 需求01:对第1列(根据逗号分割)进行去重操作,同时对2列(逗号和点分割)进行排序,取出第2列中最小的数字
    说明:
    
    
    • 需求02:最终显示(以逗号和点分割)第1列内容,第2列,第3列内容
    • 需求03:如果第3列内容(逗号和点分割),如果有一样的,取第1个.
    1000001,15.1R1
    1000003,14.2R1
    1000005,14.1R2
    1000005,14.2R3
    1000005,15.1R1
    1000006,13.3R4
    1000006,14.1R3
    1000006,14.2R1
    1000006,15.1R1
    1000007,14.2R1
    1000011,12.1X47-D15
    1000014,15.1R1
    1000020,15.1R1
    1000021,14.2R1
    1000024,15.1R1
    1000031,14.1X51-D55
    1000031,15.1R2
    1000038,13.3R4-S1
    1000038,13.3R5
    1000038,14.1R3
    1000038,14.2R1
    1000038,15.1R1
    1000039,14.2R1
    1000039,15.1R1
    1000053,15.1R1
    1000060,13.3R3-S8
    1000060,13.3R5-S3
    1000060,13.3R7
    1000060,14.1R5
    1000060,15.1R1
    
    • 实现后的结果:
    1000021,14.2R1
    1000003,14.2R1
    1000031,14.1X51-D55
    1000014,15.1R1
    1000005,14.1R2
    1000060,13.3R3-S8
    1000024,15.1R1
    1000006,13.3R4
    1000007,14.2R1
    1000053,15.1R1
    1000038,13.3R4-S1
    1000039,14.2R1
    1000001,15.1R1
    1000020,15.1R1
    1000011,12.1X47-D15
    

    2. 实现

    #简易版本
    awk -F[,.] '{ if (!n[$1])n[$1]=$2;if (!m[$1]) m[$1]=$3;if($2<n[$1])n[$1]=$2}END{for(i in n) print i","n[i]"."m[i] }'  oldboy.txt
    
    #split版本
    awk -F, '{ split($2,num,"[.]");if (!m[$1]) m[$1]=num[2];if (!n[$1])n[$1]=num[1];if(num[1]<n[$1])n[$1]=num[1]}END{for(i in n) print i","n[i]"."m[i] }'  oldboy.txt
    
    

    3. 解析

    #简易版本
    awk -F[,.] '{ 
        if (!n[$1])   #开关思想, !n[$1] 如果数组内容为空
            n[$1]=$2;           #则进行赋值, 用来存放第2列的数字,如果数字相同只保留第1个.
        if (!m[$1])   ##开关思想, !n[$1] 如果数组内容为空
            m[$1]=$3;           #则进行赋值, 用来存放第2列的数字,如果数字相同只保留第1个.
        if($2<n[$1])            #进行判断,判断第2列大小  因为是取最小值
            n[$1]=$2            #每次比较仅仅保留最小的
        }
        END{
        for(i in n)             #经典的,awk数组遍历(循环) 格式                              
                                #因为n[] m[] 数组的下标一致 ,所以可以一次性,取出
                                
            print i","n[i]"."m[i] #取出索引,和n[]数组内容,m[]数组内容
            }'  oldboy.txt
    

    相关文章

      网友评论

          本文标题:【技术案例】跟老男孩学运维-awk项目案例

          本文链接:https://www.haomeiwen.com/subject/zgzksltx.html