shell 百例收集11 awk数组的一些例子

vim f1
# cat f1
1399946_1399944_1399943_1399942_1399941_1399940_1399939_1399938_1399937_1399936_1399935_1399934_1399933_1399932_1399931_1399930

以一列的格式显示并排序
答案,
# cat f1 |awk  'BEGIN{RS="_"}{print $1}'
1399946
1399944
1399943
1399942
1399941
1399940
1399939
1399938
1399937
1399936
1399935
1399934
1399933
1399932
1399931
1399930

 

# cat f1 |awk  'BEGIN{RS="_"}{print $1 | "sort"}'
1399930
1399931
1399932
1399933
1399934
1399935
1399936
1399937
1399938
1399939
1399940
1399941
1399942
1399943
1399944
1399946

自己写的答案:复杂- -!
# cat f1|awk -F"_" '{for(i=1;i<NF;i++)a[$i]}END{for(i in a)print i,a[i]}'|sort -r              
1399946
1399944
1399943
1399942
1399941
1399940
1399939
1399938
1399937
1399936
1399935
1399934
1399933
1399932
1399931

群里一位兄弟提出了份shell题

文件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..  - -! ..终于做出来了。
]# awk '$2<30||$2>50{a[$1]+=$3}END{for(i in a)print i,a[i]}' file
3423423 2342345
234523 234234
234234 25768779
343245 2342345
 

awk 还可以去重而且顺序不变

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}'
WuHan
huhehaote
beijing
SHenZHen
 

-------------------------

有一个文件是QQ号到手机号的绑定关系,一行一个关系,格式如下:

cat file

11235334: 13443253456

11235335: 13443253457

11235336: 13443253458

11235333: 13443253458

11235336: 13443253459

11235334: 13443253452

要求统计出每个QQ绑定了几个手机,输出到一个文件里。格式如下:

11235333: 1
13443253458
11235334: 2
13443253452
13443253456
11235335: 1
13443253457
11235336: 2
13443253458
13443253459
 

答案一:
# cat file|awk '{a[$1]+=1;b[$0]=$2}END{for (i in a){print i,a[i];for(j in b)if(j~i)print b[j]}}'
答案二:
]# awk 'BEGIN{FS=": "}{a[$1]++;b[$0]=$1}END{for(i in a){print "["i"]",a[i];for(j in b){if(b[j]==i){print substr(j,11)}}}}' file

答案三:
 awk -F ':' '{a[$1]+=1;b[$1]=b[$1]"\n"$2}END{for(i in a) print i,"\n"a[i],b[i]"\n"}' file.txt

答案四:
#!/bin/bash
for qq in `cat qq.txt|awk -F":" '{print $1}'|sort|uniq`
do
  echo "[$qq]"
  grep $qq qq.txt|wc -l
  echo -e "\n"
  grep $qq qq.txt|awk -F":" '{print $2}'
done
 

你可能感兴趣的:(shell,职场,面试题,休闲)