awk实例

200阅读 0评论2015-10-13 sync_1521
分类:LINUX

例一:
[root@VM]# cat 2
a 1
a 2
b 1
b 3
c 1
d 3
要求:根据第一列求和第二列的值,在按照求和后的值递减排序
结果如下:
b 4
a 3
d 3
c 1
方法一:
[root@VM]# awk '{a[$1]+=$2}END{for(i in a){print i,a[i]|"sort -rn -k2"}}' 2
b 4
d 3
a 3
c 1
方法二:
[root@VM]# awk '{a[$1]+=$2}END{l=asort(a,b);for(i=b[l];i>=1;i--){for(j in a){if(a[j]==i) print j,a[j]}}}' 2
b 4
a 3
d 3
c 1

例二:
有一文件,每行的列长度不一,要求按照列的长短排序,由长至短。要求纯AWK实现
比如有一文件:
[root@mysqlclient ~]# cat 1
1
2 3
4 5 6
7
9 10
11 21 23 12 14


要求输出
11 21 23 12 14
4 5 6
2 3
9 10
1
7
[root@VM]# awk '{k=K>NF?k:NF;a[NF]=a[NF]?a[NF]"\n"$0:$0}END{for(i=k;i>=1;i--){if(a[i]) print a[i]}}' 3
11 21 23 12 14
4 5 6
2 3
9 10
1
7



例三:
一份文件:
guid                       city                      logintime
a2n43                guangzhou             20150930
gi34jk                 shenzhen               20151002
dfjk24                 xiamen                   20150831
13kd4                 guangzhou            20151012
gi34jk                 shenzhen               20151008


要求按照每个城市拥有的用户数排序输出(先输出用户数最多的城市的用户,比如广州有2个,先输出广州的用户名),每个城市内用户按照登录次数多到少排序输出(比如广州有A、B,深圳有C,A登录3次,B登录5次,C登录8次,则输出 B A C)。

[root@VM]# cat 1
ttt gz 3232
ttt gz 9988
zzz sz 0099
xxx sz 09877
yyy xm 8888
yyy gz 09988
ggg gz 233
ttt gz 3874
yyy gz 9887
zzz sz 8773
[root@VM]# awk '{a[$2]++}END{for(i in a) print i,a[i]}' 1|sort -rn -k2 >/tmp/ct
[root@VM]# cat /tmp/ct
gz 6
sz 3
xm 1
[root@VM]# awk '{a[$1,$2]++}END{for(i in a){split(i,b,SUBSEP);print b[1],b[2],a[i]}}' 1|sort -rn -k3 >/tmp/user
[root@VM]# cat user 
ttt gz 3
zzz sz 2
yyy gz 2
yyy xm 1
xxx sz 1
ggg gz 1
[root@VM]# while read line;do a=`awk '{print $1}' <<<$line`; awk '/'"$a"'/{print}' user;done ttt gz 3
yyy gz 2
ggg gz 1
zzz sz 2
xxx sz 1
yyy xm 1


上一篇:Linux权限位,s权限,t权限,及隐藏权限
下一篇:fsck命令