免费注册 查看新帖 |

ChinaUnix.net

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 883 | 回复: 8

[文本处理] 求助大神,多文本统计 [复制链接]

论坛徽章:
0
发表于 2019-01-03 19:03 |显示全部楼层
求助大神,统计多个文件关键字出现的次数,请大神指教如何实现,内容如下:
file1
洲,国,省,市,a
亚洲,中国,宁夏,银川,fsaf
亚洲,中国,辽宁,沈阳,gag
亚洲,中国,河北,石家庄,sgag
亚洲,中国,陕西,西安,eyy
亚洲,中国,陕西,西安,xv

file2
洲,国,省,市,b
亚洲,中国,辽宁,沈阳,xcv
亚洲,中国,宁夏,银川,kryh
亚洲,中国,陕西,西安,la
亚洲,中国,河南,郑州,pwej



file3
洲,国,省,市,c
亚洲,中国,陕西,西安,wow
亚洲,中国,河北,石家庄,cfg
亚洲,中国,甘肃,兰州,cnf
亚洲,中国,陕西,西安,aaww



统计想要的结果
洲,国,省,市,file1,file2,file3
亚洲,中国,宁夏,银川,1,1,0
亚洲,中国,辽宁,沈阳,1,1,0
亚洲,中国,河北,石家庄,1,0,1
亚洲,中国,陕西,西安,2,1,2
亚洲,中国,河南,郑州,0,1,0
亚洲,中国,甘肃,兰州,0,0,1

论坛徽章:
0
发表于 2019-01-09 16:09 |显示全部楼层
本帖最后由 csccyab 于 2019-01-09 16:13 编辑

$ awk -F',' 'FNR>1{a[$1,$2,$3,$4]} FILENAME==ARGV[1]&&FNR>1{a1[$1,$2,$3,$4]++} FILENAME==ARGV[2]&&FNR>1{a2[$1,$2,$3,$4]++} FILENAME==ARGV[3]&&FNR>1{a3[$1,$2,$3,$4]++}END{for (i in a) {split(i,b,SUBSEP); printf "%s,%s,%s,%s,%d,%d,%d\n",b[1],b[2],b[3],b[4],a1,a2,a3}} ' file1 file2 file3
亚洲,中国,河北,石家庄,1,0,1
亚洲,中国,陕西,西安,2,1,2
亚洲,中国,宁夏,银川,1,1,0
亚洲,中国,甘肃,兰州,0,0,1
亚洲,中国,河南,郑州,0,1,0
亚洲,中国,辽宁,沈阳,1,1,0

论坛徽章:
0
发表于 2019-01-10 11:09 |显示全部楼层
回复 2# csccyab

这个我执行之后报错 awk: cmd. line:1: (FILENAME=file3 FNR=5) fatal: attempt to use array `a1' in a scalar context

论坛徽章:
0
发表于 2019-01-10 11:09 |显示全部楼层
回复 2# csccyab

这个我执行之后报错 awk: cmd. line:1: (FILENAME=file3 FNR=5) fatal: attempt to use array `a1' in a scalar context

论坛徽章:
0
发表于 2019-01-10 11:10 |显示全部楼层
本帖最后由 CDX0923 于 2019-01-10 11:12 编辑

回复 2# csccyab

论坛报错就多出现了几条回复

论坛徽章:
0
发表于 2019-01-10 14:01 |显示全部楼层
This should be correct:

awk -F',' 'FNR>1{a[$1,$2,$3,$4]} FILENAME==ARGV[1]&&FNR>1{a1[$1,$2,$3,$4]++} FILENAME==ARGV[2]&&FNR>1{a2[$1,$2,$3,$4]++} FILENAME==ARGV[3]&&FNR>1{a3[$1,$2,$3,$4]++}END{for (i in a) {split(i,b,SUBSEP); printf "%s,%s,%s,%s,%d,%d,%d\n",b[1],b[2],b[3],b[4],a1[i],a2[i],a3[i]}} ' file1 file2 file3

评分

参与人数 1信誉积分 +5 收起 理由
CDX0923 + 5 很给力! 如果是几十个文件的话,这个写法有.

查看全部评分

论坛徽章:
0
发表于 2019-01-10 17:29 |显示全部楼层
csccyab 发表于 2019-01-10 14:01
This should be correct:awk -F',' 'FNR>1{a[$1,$2,$3,$4]} FILENAME==ARGV[1]&&FNR>1{a1[$1,$2,$3,$4]++}  ...

可以了,谢谢大神

论坛徽章:
0
发表于 2019-01-11 10:27 |显示全部楼层
回复 6# csccyab

如果是几十个文件的话这个有优化的写法吗

论坛徽章:
0
发表于 2019-01-11 17:16 |显示全部楼层
$ cat 3.py
import collections, sys, re

filecount=0
dict1 = collections.defaultdict(list)

for file1 in sys.argv[1:]:
   filecount+=1
   f = open(file1, "r")
   linecount=1
   for line in f:
      if linecount>1:
         p = re.search("^(.+),.+", line.strip())
         if p:
            dict1[p.group(1)].append(filecount)
      linecount+=1

for the_key, the_value in dict1.iteritems():
   count=''
   sys.stdout.write(the_key + ',')
   c = collections.Counter(the_value)
   for i in range(1,filecount+1):
      if count:
         count = count + "," + str(c[i])
      else:
         count = str(c[i])
   print(count)


$ python 3.py file1 file2 file3
亚洲,中国,辽宁,沈阳,1,1,0
亚洲,中国,陕西,西安,2,1,2
亚洲,中国,甘肃,兰州,0,0,1
亚洲,中国,河南,郑州,0,1,0
亚洲,中国,宁夏,银川,1,1,0
亚洲,中国,河北,石家庄,1,0,1


您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

数据风云,十年变迁
DTCC 第十届中国数据库技术大会已启航!

2019年5月8日~5月10日,由IT168旗下ITPUB企业社区平台主办的第十届中国数据库技术大会(DTCC2019),将在北京隆重召开。大会将邀请百余位行业专家,就热点技术话题进行分享,是广大数据领域从业人士的又一次年度盛会和交流平台。与SACC2018类似,本届大会将采用“3+2”模式:3天传统技术演讲+2天深度主题培训。大会不仅提供超100场的主题演讲,还会提供连续2天的深度课程培训,深化数据领域的项目落地实践方案。
DTCC2019,一场值得期待的数据技术盛会,殷切地希望您报名参与!

活动入口>>
  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP