一個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