awk的一个题目
同学问我一道awk的题目:
引用
给定用户的多维度信息:userID,userName,userAge,userLogTime
给定文本数据userAccess.dat:userID,userName,userAge,userLogTime
格式说明:userID--用户ID编号,采用32位数字编码;
userLogTime--用户登录时间,采用YY-MM-DD格式,如(2010-3-12,2010-12-6);
userName--用户名,采用小于16位的任意字母和数字的组合;
userAge--用户年龄。
由于登录时间不同,同一个用户可能有多条记录。请编写awk脚本,完成如下功能:从当前目录下读取userAccess.dat文件;按照userID,userLogTime进行两级排序;最终输出文件到/temp/B.txt文件进行存储。
我也不会写awk,现学现卖一下:
这个可以通过把userLogTime规范化(2010-3-12-->2010-03-12)之后再和userID联合作为key排序.
代码:
#!/bin/awk -f { split($4,str_arr,"-"); m = str_arr[2]; if(length(str_arr[2]) == 1){ m = sprintf("%s%s","0",m); } d = str_arr[3]; if(length(str_arr[3]) == 1){ d = sprintf("%s%s","0",d); } date = sprintf("%s-%s-%s",str_arr[1],m,d); key = sprintf("%s%s",$1,date); userInfo[key] = sprintf("%s\t%s\t%s\t%s",$1,$2,$3,$4); } END{ i = 0; for(k in userInfo){ keyset[i++] = k; } asort(keyset); for(i = 0; i < length(keyset); i++){ print userInfo[ keyset[i] ]; } }
运行命令:
catuserAccess.dat|awk-f"sort.awk">/temp/B.txt
如果输出结果日期是修正过的,也可以使用shell的sort来搞:
#!/bin/awk -f { split($4,str_arr,"-"); m = str_arr[2]; if(length(str_arr[2]) == 1){ m = sprintf("%s%s","0",m); } d = str_arr[3]; if(length(str_arr[3]) == 1){ d = sprintf("%s%s","0",d); } printf("%s\t%s\t%s\t%s-%s-%s\n",$1,$2,$3,str_arr[1],m,d); }
然后在用命令
catuserAccess.dat|awk-f"nomalize.awk"|sort+0-3
相关推荐
chenpro 2020-07-04
fendou00sd 2020-06-16
RealJianyuan 2020-06-14
cwgxiaoguizi 2020-06-05
chenpro 2020-06-02
Neptune 2020-05-31
老谢的自留地 2020-05-09
YukiRain 2020-05-08
baobaozai 2020-04-29
Proudoffaith 2020-04-08
fenxinzi 2020-03-01
zhiliang 2020-01-31
wannagonna 2020-01-13
wandererdl 2019-12-25
chenchuang 2020-01-25
jyj00 2020-01-09
fendou00sd 2020-01-07
fendou00sd 2020-01-06
PHP学习笔记 2020-01-06