shitou's blog 

  • Home
  • About
  • Feed
  • 十人族
  • MIX BOY
  • 塌客

Category "system manage"

08
Apr

awk多维数组

awk不支持多维数组, 在官方的文档中所说的多维数组并不是传统语言所说的多维数组,awk的多维数组是如:

 

awk '{
     if (max_nf < NF)
          max_nf = NF
     max_nr = NR
     for (x = 1; x <= NF; x++)
          vector[x, NR] = $x
}

END {
     for (x = 1; x <= max_nf; x++) {
          for (y = max_nr; y >= 1; --y)
               printf("%s ", vector[x, y])
          printf("\n")
     }
}'

 

在某些情况下需要使用传统多维数组的方式对数据进行统计,生成例如

arr[key] = [field1, filed2, filed3]

这样的数据结构,虽然awk默认不支持这样的数据结构,但是我们可以自己以另一种方式实现,比如上面的数据结构可以变成这样:

arr[key] = "field1@field2@field3"; split(arr[key], arr2, "@")

就是以字符串分割的方式,然后再用split还原, 下面是一个例子,统计下面文件中第一个field重复行的后面字段进行相加,并添加几个filed实现比例统计, 文件是这样的, file.txt:

1270022377 17 0 0 0 0.00 0.00 0.00
1270022399 9 0 0 0 0.00 0.00 0.00
1270022377 17 0 0 0 0.00 0.00 0.00
1270538893 16 8 2 0 50.00 12.50 0.00
1270022399 9 0 0 0 0.00 0.00 0.00
1270538893 16 8 2 0 50.00 12.50 0.00

 

shell:

awk 'BEGIN{print("Ad View Hit Reg Pay Hit(%) Reg(%) Pay(%)");} \
    1{if($1 in a) { \
        split(a[$1], b, "@"); \
        a[$1]=sprintf("%s@%s@%s@%s@%s", $1, int($2)+int(b[2]), int($3)+int(b[3]), int($4)+int(b[4]), int($5)+int(b[5])); } \
      else { \
        a[$1]=sprintf("%s@%s@%s@%s@%s", $1, int($2), int($3), int($4), int($5))} \
     }; \
     END{for(line in a) { \
            split(a[line], c, "@"); \
            printf("%s %s %s %s %s %.2f %.2f %.2f\n", c[1], c[2], c[3], c[4], c[5], \
                int(c[3])/int(c[2])*100, \
                int(c[4])/int(c[2])*100, \
                int(c[5])/int(c[2])*100); \
        }}' file.txt

 

结果:

Ad View Hit Reg Pay Hit(%) Reg(%) Pay(%)
1270538893 32 16 4 0 50.00 12.50 0.00
1270022377 34 0 0 0 0.00 0.00 0.00
1270022399 18 0 0 0 0.00 0.00 0.00

 

Tags: shell

2010-04-08 13:36:07, 3813 reviews, comment

send to mailbox

Your email:

Related Posts

Shell script to backup all MySQL database

【转载】命令的小总结

MySQL Innodb备份

shell中的数组

一些shell技巧

( ),{ }的区别

一个小命令

awk同时操作两个文件

shell小技巧

Shell: 统计MySQL InnoDB表的大小

继续凸墙 for Mac OS

json_formatter

TOP

Tags

json Impactjs Canvas fun gen_server superfly PS3 Webgame HTML5 jquery SSH tenerer MooseFS gearman-ruby Gearman MongoDB MochiChat TCP U-ka saegusa IN db command Mai Kuraki Norah Jones log iPhoneException ACG Mac Safari objective-c CouchDB LVS AJAX debian 推荐 AMQP google mail bug gettext Erlang 北京 iptables 架构 tips mysql backup function 我看 postfix 监控 SEO cache Etag memcache thread 进程 线程 无锡 yield file column mixboy xml rss gems ruby shitou shell lighttpd 安全 csrf 公司 nginx linux 模块 apache webserver 朋友 大学 生活 尼古拉斯凯奇 movie 文件同步 笑笑 歌词 auto complete plugin rails music ubuntu blog

Category

  • HTML5[3]
  • iPhone[17]
  • Erlang[11]
  • google[13]
  • 生活[45]
  • 音乐[13]
  • 电影[11]
  • linux[29]
  • web server[6]
  • mail server[3]
  • cluster[1]
  • system manage[9]
  • ruby[20]
  • ruby on rails[28]
  • 开源[4]

Episode

  • MongoDB
  • MochiChat
  • iPhoneException
  • shell
  • thread
  • memcache


Popular Posts

  • 准备开始学习Erlang了(恶狼, 二郎..)
  • Ruby遍历MemCached的key
  • 服务器监控小脚本
  • MySQL Innodb备份
  • [转载]5个有用的ruby gems

Recommended Posts

  • Tri-survive - HTML5 Game
  • Cut the rope - HTML5版
  • json_formatter
  • 在gen_server中spawn新的进程
  • Superfly - Wildflowers
  • 继续凸墙 for Mac OS
  • MongoDB Beijing 2011
  • MongoDB删除map_reduce生成的tmp collection
  • Mai Kuraki - Future Kiss
  • Erlang OOP
  • 用SSH tunnel凸墙
  • Google的语法高亮工具包
  • 大量数据的批量操作
  • 再次被和谐-_-
  • 十人族: 上线了

Friends' blogs

  • levy
  • sphance
  • andreas
  • yangkunlun
  • {:dev=>:wxianfeng}
  • bheye
  • joeydarko

Login

   注册

留言 查看留言

留言

   取消

留言 查看留言


Statistics

  • 访问次数: 316267
  • 今天访问: 62
  • 日志: 213
  • 评论: 4967
  • 音乐: 9
  • 用户: 1759


少年,不点下广告吗!

 

all by shitou

blog comments powered by Disqus

close