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