awk的一个题目

同学问我一道awk的题目:
[quote]
给定用户的多维度信息: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文件进行存储。
[/quote]
我也不会写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] ];
}
}

运行命令:
cat userAccess.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);
}

然后在用命令
cat userAccess.dat | awk -f "nomalize.awk" | sort +0 -3
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值