【技術案例】跟老男孩學運維-awk項目案例

一個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
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容