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

相关推荐