以下为网上看到的某面试题,发现之前自己对awk数组不了解。以下自己的理解。并整理网络部分例子。
1.有一个文件是QQ号到手机号的绑定关系,一行一个关系,格式如下:
#cat qq
11235334:13443253456
11235335:13443253457
11235336:13443253458
11235333:13443253458
11235336:13443253459
11235334:13443253452
要求统计出每个QQ绑定了几个手机,输出到一个文件里。格式如下:
[11235333]
1
13443253458
[11235334]
2
13443253456
13443253452
[11235335]
1
13443253457
[11235336]
2
13443253458
13443253459
#awk -F: '{a[$1]=a[$1]"\n\n"$2;b[$1]++}END{for (i in a)print "["i"]""\n"b[i],a[i]}' qq
解释:a[$1]=a[$1]"\n\n"$2
第一行 读入前a[11235334]= NULL 。读入第一行,赋值 即 a[11235334]=NULL"\n\n"13443253456="\n\n"13443253456 其中第一个\n为换行。第二个\n为空一行
第二行 a[11235335]= "\n\n"13443253457
第六行 a[11235334]= a[第一行已赋值]"\n\n"13443253452=NULL"\n\n"13443253456"\n\n"13443253452
b[$1]++ :数组计数,以$1下标区分。
i in a
:下标i in数组a, i即各个$1去重复。 a[i]为迭代赋值$2
#############以下整理自网络,并作错误修改改。############################
2.数列
# cat 1.txt
1 2 3 4 9
4 2 1 3
1 7 8 2
最大值awk '{for(i=1;i<=NF;i++)if($i>a)a=$i;b[NR]=a}END{for(j=1;j<NR;j++)if(ma<b[j])ma=b[j];print ma}' 1.txt
行平均awk '{for(i=1;i<=NF;i++)a+=$i;print a/NF}' 1.txt
列总和awk '{for(i=1;i<=NF;i++)b[i]+=$i}END{for (i=1;i<=NF;i++)print b[i]}' 1.txt
###########################################################################################
3.号码、等级、时长
#cat file.txt (第一列号码--有重号的 ,第二列等级,第三列在线时长秒记)
123432 34 2345545
343245 23 2342345
234234 23 23423545
234523 65 234234
3423423 25 2342345
234234 23 2345234
用awk 取出3列值第一列号码,第二列等级要求小于30或者大于50 ,第三列要求相同号码的在线时间累积值。
# awk '$2<30||$2>50{a[$1]+=$3}END{for(i in a)print i,a[i]}' file.txt (缺第二列)
3423423 2342345
234523 234234
234234 25768779
343245 2342345
# awk '$2<30||$2>50{a[$1" "$2]+=$3}END{for(i in a)print i,a[i]}' file.txt (补上第二列,假设第二列不变)
###########################################################################################
4.awk 实现uniq
cat a
WuHan
WuHan
WuHan
WuHan
beijing
beijing
huhehaote
huhehaote
SHenZHen
SHenZHen
beijing
huhehaote
huhehaote
SHenZHen
SHenZHen
# cat a|awk '{a[$1]}END{for(i in a) print i}' //其实a[$1]数组各值还是为空。
WuHan
huhehaote
beijing
SHenZHen
##########################
5.数组清空
[1.]delete array[index]
[2.]for (i in frequencies)
delete frequencies[i]
参考:
http://dogdogcom.blog.51cto.com/2402458/521084
http://hi.baidu.com/hevensun/blog/item/e9970a4ccec77ff2d62afc27.html
###############################################################################
附1:
执行顺序
#awk ‘条件1{print $1} 条件2{print $2}’ file1 file2
1 2 《---file1 line1
3
4
《--file 1 lin
5
6 《file2 line1 。。
附2:
在 awk 中数组叫做关联数组(associative arrays),
下标记可以是数也可以是串。awk 中的数组不必提前声明,也不必声明大小。下标从1开始。
由于awk数组,是关联数组。for…in循环输出时候,默认打印出来是无序数组。 手动排列 for(i=1;i<=XX;i++){print i,a[i];