瞎扯淡 出考题了,用命令或简单脚本快速统计锦江 csv 记录再排序

cxh116 · 2013年10月16日 · 最后由 leopku 回复于 2013年10月16日 · 4441 次阅读

这个 csv 的头

Name,CardNo,Descriot,CtfTp,CtfId,Gender,Birthday,Address,Zip,Dirty,District1,District2,District3,District4,District5,District6,FirstNm,LastNm,Duty,Mobile,Tel,Fax,EMail,Nation,Taste,Education,Company,CTel,CAddress,CZip,Family,Version,id
陈xx,,,OTH,010-116321,M,19000101,北京市海淀区xxx,100080, ,,CHN,0,0,,,,,,10116,010-xx,010-xx-208,[email protected],,,,,,,,0,2012-12-23 11:13:38,2
赵xx,,,ID,21010219880204xxxx,M,1988xxx,-,-, ,,CHN,21,210102,,,,,,186024xxx,-,-,[email protected],,,,,,,,0,2011-3-22 17:35:12,100

比如统计最白菜的名字,或邮箱后缀等

使用的源文件 https://www.copy.com/s/UyiPPS4mZtnZ/Public/shifenzheng.csv.zip


另外问个问题,为什么用 sort 和 uniq 命令排序统计这么省内存,如果用 ruby 实现这样省内存的排序统计

这个 嘛。你把你名字电话告诉我。我找到了给你发过去。对了,别忘了身份证号码。。:)

#1 楼 @jarorwar 这是锦江数据库的 csv 文件,wc -l 统计一下,有 20051406 条记录 到时用 256m 内存的 vps 测试一下,看那个写的脚本最快最简捷

records = []

File.open('xxx.csv') do |f|
    first_line = true   
    f.each_line do |line|
        if first_line
            @headers = line.chomp.split(',')
            first_line = false
        else
            record = {}
            line.chomp.split(',').each_with_index do |value, idx|
                record[@headers[idx]] = value
            end
            records << record
        end
    end
end

# 白菜名
records.group_by {|record| record["Name"]}.each do |name, _records| 
    if @max.to_i < _records.size 
        @max = _records.size
        @baicai_name = name
    end
end

p @baicai_name, @max

# 邮箱后缀
@max = 0
records.group_by {|record| record["EMail"][/@.*$/]}.each do |email_suffix, _records| 
    if @max.to_i < _records.size 
        @max = _records.size
        @baicai_email_suffix = email_suffix
    end
end

p @baicai_email_suffix, @max
```ruby

#3 楼 @piecehealth 内存会爆掉吧..

#4 楼 @suupic 刚刚知道是什么 csv……

发个自己参考网上写的一个统计白菜名的。在 256m 的 vps 运行正常

按白菜名排行,伟字最白菜

zcat jinjianginns.zip | cut -d "," -f1 | sort | uniq -c | sort -nr | head -n 100
  12724 张伟
  12461 王伟
  10736 王磊
  10180 李伟
  10047 张磊
   9122 刘伟
   8311 李强
   8152 张勇
   8144 王勇
   7713 刘洋
   7650 王军
   7506 李军
   7288 王强
   7137 王涛
   7009 王静
   6989 张静
   6975 张涛
   6896 李娜
   6887 李静
   6770 张军
   6735 王鹏
...
real    1m48.698s
user    1m36.683s
sys 0m8.078s

统计邮箱后缀

time zcat jinjianginns.zip | cut -d "," -f 23 | cut -d "@" -f 2 | sort | uniq -c | sort -nr | head -n 10
 548213 163.com
 544205 qq.com
 289192 待定
 255554 126.com
 194732 hotmail.com
 145228 sina.com
  96778 yahoo.com.cn
  93775 gmail.com
  62670 139.com

real    1m18.906s
user    1m12.393s
sys 0m4.672s

按年排行。这是不是可以与生肖挂钩,或者星座?

 time zcat jinjianginns.zip | cut -d "," -f 7| cut -c -4 | sort | uniq -c | sort -nr | head -n 10
 956820 1982
 856146 1987
 840358 1900
 833848 1986
 765130 1981
 744271 1985
 743698 1983
 741592 1988
 724653 1984
 663682 1989

real    1m25.013s
user    1m16.030s
sys 0m6.483s

#3 楼 @piecehealth 这样内存应该会爆,压缩文件都有 1G,就 10G 的空间我都不敢解压的。

导入 pg 然后慢慢查

做这类筛选明显是 shell 管道的拿手菜,ruby 不适合做这个,速度巨慢不说还吃内存

#2 楼 @cxh116 有木有别的啊?例如七天,汉庭。

#9 楼 @diudiutang 为什么 shell 管道就省内存了?它是怎么做到统计排序不用占用很多内存的?

#11 楼 @cxh116 cat、sort、cut、grep 这些都是 c/c++ 写的,而且每个命令都只干一件事,最后经过这么多*nix 使用多年牛人优化

需要 登录 后方可回复, 如果你还没有账号请 注册新账号