免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4971 | 回复: 11
打印 上一主题 下一主题

[文本处理] 文本中指定字段加密处理为md5值 [复制链接]

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:54:45
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2020-01-10 20:31 |只看该作者 |倒序浏览
文本内容为:

1@@@13660888666@@@2019-09-08 23:29:00
2@@@13660888777@@@2019-09-08 23:29:00
3@@@13660888888@@@2019-09-08 23:29:00

列分割符为@@@需要把文件中第二个字段中手机号用md5加密,加密后md5为大写字母
效果为
1@@@47B473CF198BA182B20CF3A02FEFA87C@@@2019-09-08 23:29:00
2@@@A2BA33550D924FD0714370D0AB255B78@@@2019-09-08 23:29:00
3@@@6FEEE6C1F7740F2758278514ED261338@@@2019-09-08 23:29:00

文件很大有几十亿,shell怎么处理能效率高些呢。



论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:54:45
2 [报告]
发表于 2020-01-11 12:11 |只看该作者
我写了个,可处理效率太低了一个小时也就100w,哪位大神指点一下
#!/bin/bash

while read i
do
k1=`echo "$i"|awk -F "@@@" '{print $2}'`
k2=`echo -n "$k1"|md5sum |cut -d" " -f1|tr a-z A-Z`
echo $i |sed "s/$k1/$k2/" >> $1.csv
done < $1

论坛徽章:
8
2016科比退役纪念章
日期:2018-10-24 08:24:0115-16赛季CBA联赛之北控
日期:2019-03-12 14:34:562016科比退役纪念章
日期:2019-04-01 10:33:0915-16赛季CBA联赛之山东
日期:2019-04-17 12:46:3215-16赛季CBA联赛之广夏
日期:2019-05-09 16:40:4015-16赛季CBA联赛之广夏
日期:2019-10-10 15:33:4015-16赛季CBA联赛之辽宁
日期:2019-10-15 08:37:0615-16赛季CBA联赛之北控
日期:2021-03-30 15:53:34
3 [报告]
发表于 2020-01-11 15:03 |只看该作者
本帖最后由 cfwyy 于 2020-01-11 16:31 编辑

awk 倒是一条就可以输出结果,不需要sed,可能会快一丢丢。
  1. awk 'BEGIN{FS=OFS="@@@"}{cmd=sprintf("echo %s|md5sum|cut -d\" \" -f1|tr a-z A-Z",$2);cmd|getline $2;close(cmd);print $0}' file
复制代码


不过话说,几十亿条数据,全国人民的手机号码都被你收录了吧,仅用一个文本文件 是不是有点随便了。几十亿条数据完全只让shell处理,是不是有点难为shell了
大数据处理是不是至少该用上 分块读取,多线程,多进程之类的啦,再不行上 分布式,Hadoop?  这些咱也不懂,咱也不敢多说,逃~~

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
4 [报告]
发表于 2020-01-11 15:26 |只看该作者
如果只是对手机号做md5有啥用呢?反查也没多少。
形式主义!

论坛徽章:
1
19周年集字徽章-年
日期:2020-10-29 09:39:21
5 [报告]
发表于 2020-01-13 08:49 |只看该作者
效率是不是很快我没测试,毕竟没有你的那么大文档,修改原文件的话跟sed一样的加个-i。
perl -MDigest::MD5=md5_hex -pe's#@@@\K[^@]+#uc md5_hex$&#e' file

论坛徽章:
24
申猴
日期:2014-10-10 15:56:39射手座
日期:2014-10-10 15:57:18黑曼巴
日期:2018-05-14 11:05:122016科比退役纪念章
日期:2018-05-14 11:05:0715-16赛季CBA联赛之北控
日期:2018-05-14 11:05:0015-16赛季CBA联赛之江苏
日期:2017-02-27 18:11:0715-16赛季CBA联赛之上海
日期:2018-08-15 09:48:5415-16赛季CBA联赛之佛山
日期:2018-07-20 17:14:2315-16赛季CBA联赛之佛山
日期:2019-09-10 18:08:4615-16赛季CBA联赛之山西
日期:2020-03-26 09:40:5115-16赛季CBA联赛之佛山
日期:2020-05-08 09:03:54
6 [报告]
发表于 2020-01-13 09:54 |只看该作者
本帖最后由 chengchow 于 2020-01-13 09:59 编辑

几十亿的数据用shell处理是很慢的,看你忍耐程度
偶尔处理一次的话用python,shell都行,经常处理,如楼上所说搭建个大数据平台比较合适


spark+hadoop+hive

论坛徽章:
0
7 [报告]
发表于 2020-01-13 17:15 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
8 [报告]
发表于 2020-01-15 16:47 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
10
15-16赛季CBA联赛之同曦
日期:2016-06-11 19:22:4115-16赛季CBA联赛之深圳
日期:2020-05-31 16:13:5615-16赛季CBA联赛之同曦
日期:2020-01-28 12:42:47每日论坛发贴之星
日期:2016-08-09 06:20:00程序设计版块每日发帖之星
日期:2016-08-09 06:20:00每日论坛发贴之星
日期:2016-07-12 06:20:00程序设计版块每日发帖之星
日期:2016-07-12 06:20:00程序设计版块每日发帖之星
日期:2016-07-06 06:20:00程序设计版块每日发帖之星
日期:2016-07-04 06:20:0015-16赛季CBA联赛之佛山
日期:2021-02-26 09:33:41
9 [报告]
发表于 2020-01-27 19:18 |只看该作者
root@lp:~/jw/python/data# cat phone_md5.txt
1@@@13660888666@@@2019-09-08 23:29:00
2@@@13660888777@@@2019-09-08 23:29:00
3@@@13660888888@@@2019-09-08 23:29:00
root@lp:~/jw/python/data# python md5_phone.py
root@lp:~/jw/python/data# cat md5_phone.py
import pandas as pd
import hashlib


def md5(x):
     a = hashlib.md5()
     a.update(str(x).encode())
     return a.hexdigest().upper()


a = pd.read_csv('phone_md5.txt',sep='@@@',header=None,engine='python',names=['id','phone','time'])
a['phone'] = a.phone.apply(md5)
a.to_csv('md5.csv',index=None,header=None)
root@lp:~/jw/python/data#
root@lp:~/jw/python/data# cat md5.csv
1,47B473CF198BA182B20CF3A02FEFA87C,2019-09-08 23:29:00
2,A2BA33550D924FD0714370D0AB255B78,2019-09-08 23:29:00
3,6FEEE6C1F7740F2758278514ED261338,2019-09-08 23:29:00

2020-01-27 19-17-17 的屏幕截图.png (268.98 KB, 下载次数: 70)

2020-01-27 19-17-17 的屏幕截图.png

论坛徽章:
0
10 [报告]
发表于 2020-02-26 14:33 |只看该作者
本帖最后由 Looiml 于 2020-02-26 14:47 编辑

回复 1# yiguihuo
这任务用shell肯定慢,你调用了那么多外部程序,而且是每一行数据都要调用一次。
我复制了你的数据总共30万行做测试:
  1. $ ll b.txt
  2. -rwxrw-r--+ 1 Vic Vic 11400228 2月  26 12:59 b.txt
复制代码

然后单纯用Python来做:cat test.py
  1. import hashlib

  2. m=hashlib.md5()
  3. with open("b.txt") as fin, open("result.txt","w") as fout:
  4.     for line in fin:
  5.         l=line.split("@@@")
  6.         b=l[1].encode(encoding='utf-8')
  7.         m.update(b)
  8.         l[1]=m.hexdigest().upper()
  9.         fout.write("@@@".join(l))
复制代码

花的时间也才1s不到,算下来你所有数据也能在一小时内处理完毕,而且我这代码只是做简单性能对比,还没有做多线程优化之类的。
  1. $ time ./test.py

  2. real    0m0.719s
  3. user    0m0.000s
  4. sys     0m0.031s
复制代码
结果:
  1. 1@@@47B473CF198BA182B20CF3A02FEFA87C@@@2019-09-08 23:29:00
  2. 2@@@83F1954EB72BBAEC24A27ED26EB2E0E8@@@2019-09-08 23:29:00
  3. 3@@@9C7FE5A2312DE1FFA870C9F1B486D4E3@@@2019-09-08 23:29:00
  4. 1@@@8399C17E854D8CF8E8C6D0A78119FAB7@@@2019-09-08 23:29:00
  5. 2@@@78CBE98B9DB160339F7D0110B2212C4C@@@2019-09-08 23:29:00
  6. 3@@@4155144377DC81C43E608B02F3434132@@@2019-09-08 23:29:00
  7. 1@@@718F08BED583258C64E9A297E3BCED10@@@2019-09-08 23:29:00
  8. 2@@@FF08416D1EF49A7314E169498902960E@@@2019-09-08 23:29:00
  9. 3@@@03922384048A52237744E2229ABC8772@@@2019-09-08 23:29:00
  10. 1@@@0635046E7D912274F7D9F4D3697325F6@@@2019-09-08 23:29:00
  11. 2@@@DD9B5D770FB4330EA255A63A09A75DF4@@@2019-09-08 23:29:00
  12. 3@@@A1292F1024F9B2EE45563A43FD35CD72@@@2019-09-08 23:29:00
  13. 1@@@A367D6FF83E970A4672D92AFC7735F3F@@@2019-09-08 23:29:00
  14. <div>2@@@84FBD8599FE9CF6D4845479631519B6B@@@2019-09-08 23:29:00</div><div>......</div>
复制代码




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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP