以下为网上看到的某面试题,发现之前自己对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];