一個awk數(shù)組應(yīng)用案例
[TOC]
0.技術(shù)點:
- awk
- awk數(shù)組
- awk判斷
- awk數(shù)組賦值
- awk函數(shù)split
1.詳細(xì)需求
有如下文本內(nèi)容:完成如下所有需求:
- 需求01:對第1列(根據(jù)逗號分割)進(jìn)行去重操作,同時對2列(逗號和點分割)進(jìn)行排序,取出第2列中最小的數(shù)字
說明:
- 需求02:最終顯示(以逗號和點分割)第1列內(nèi)容,第2列,第3列內(nèi)容
- 需求03:如果第3列內(nèi)容(逗號和點分割),如果有一樣的,取第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
- 實現(xiàn)后的結(jié)果:
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. 實現(xiàn)
#簡易版本
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]) #開關(guān)思想, !n[$1] 如果數(shù)組內(nèi)容為空
n[$1]=$2; #則進(jìn)行賦值, 用來存放第2列的數(shù)字,如果數(shù)字相同只保留第1個.
if (!m[$1]) ##開關(guān)思想, !n[$1] 如果數(shù)組內(nèi)容為空
m[$1]=$3; #則進(jìn)行賦值, 用來存放第2列的數(shù)字,如果數(shù)字相同只保留第1個.
if($2<n[$1]) #進(jìn)行判斷,判斷第2列大小 因為是取最小值
n[$1]=$2 #每次比較僅僅保留最小的
}
END{
for(i in n) #經(jīng)典的,awk數(shù)組遍歷(循環(huán)) 格式
#因為n[] m[] 數(shù)組的下標(biāo)一致 ,所以可以一次性,取出
print i","n[i]"."m[i] #取出索引,和n[]數(shù)組內(nèi)容,m[]數(shù)組內(nèi)容
}' oldboy.txt