楼主: 时光永痕
878 0

[数据挖掘新闻] AWK-争吵过去的爆炸。 [推广有奖]

  • 0关注
  • 14粉丝

svip3

学术权威

12%

(VIP/贵宾)八级

10%

威望
0
论坛币
26 个
通用积分
57.2238
学术水平
4 点
热心指数
4 点
信用等级
4 点
经验
34180 点
帖子
2732
精华
0
在线时间
321 小时
注册时间
2020-7-21
最后登录
2024-8-1

楼主
时光永痕 学生认证  发表于 2020-9-11 19:47:34 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
AWK-争吵过去的爆炸。
最近,我遇到了一位实用数据科学家关于如何处理25 TB数据的有趣演讲。最初引起我注意的是文章的标题:“使用AWK和R解析25tb”。我现在是R的大用户,并在30年前以崭新的数据分析师的身份在AWK谋生。我也很欣赏作者对他如何处理海量数据的痛苦而持续的教育的叙述:“我没有失败一千次,我只是发现了一千种不将大量数据解析为易于查询的格式的方法。 。” 去过也做过。
这些年来,阅读完这篇文章后,我再次对AWK感兴趣。AWK是perl和python的基于Unix的改进产品,特别擅长处理带分隔符的文本文件,将每个记录自动拆分为标识为1、2等的字段。我对AWK的使用通常取决于选择列(投影)和行(过滤),然后将结果通过管道传递到其他脚本以进行其他处理。我发现AWK很好地完成了这些简单的任务,但却无法扩展到要求更高的数据编程上-很好地记住了当我试图扭曲AWK来执行原本不想做的事情时遇到的麻烦。确实,当80年代末出现更全面的Perl时,我几乎放弃了AWK。回想起来,我不确定那是最好的课程。
因此,我只需要重新熟悉AWK,然后下载了GNU版本gawk。然后,我在一个相当大的数据源上划分了几个快速任务来测试该语言。用于分析的数据由4个大型普查信息文件组成,总计超过14 GB,这些文件总计包括1580万记录和286个属性。我使用AWK投影/过滤输入数据,然后将结果传递给python或R以进行分析处理。AWK进行了一些繁重的工作,尽管处理简单。在我的测试中,R和python / pandas都可以处理AWK的任务,但是不难想象需要预先进行项目/过滤的管道。   
与我使用Jupyter Notebook编写的其他博客不同,该博客不是在python或R内核中执行的。相反,笔记本仅显示AWK,python和R脚本及其输出。
AWK脚本,用于将属性编号与列标题名称匹配。
dict.awk
gawk -F,'BEGIN {OFS =“,”} NR == 1 {split($ 0,dict,“,”);对于(d in dict)print d,dict [d]}'psam_pusa.csv
命令行运行dict.awk(以及一些输出)。
./dict.awk 2> null | 头
1,RT
2,SERIALNO
3,DIVISION
4,SPORDER
5,PUMA
6,REGION
7,ST
8,ADJINC
9,PWGTP
10,AGEP
基本的awk脚本,用于过滤和投影来自四个pums文件的相关数据。
pums.awk
gawk -F,'BEGIN {OFS =“,”}(NR == 1 || FNR!= 1)&&($ 10> = 18 && $ 104> 1000)\ {打印$ 2,$ 3,$ 5,$ 6,$ 7,$ 8,$ 10,$ 39,$ 67,$ 69,$ 89,$ 104,$ 112}'psam_pusa.csv psam_pusb.csv psam_pusc.csv psam_pusd.csv
接下来,使用/处理从awk管道传输的数据的python脚本。该脚本根据输入数据创建数据帧,并输出可与R和Linux OS互操作的高性能羽化文件。
pums.py
导入sys,将pandas作为pd,将numpy作为np,feather
导入警告
warnings.filterwarnings('ignore')
functdir =“ c:/ steve / jupyter / notebooks / functions”
sys.path.append(functdir)
从newmyfuncs导入*
fthname =“ pumspy.feather”
pums = pd.read_csv(sys.stdin,header = 0)
pums.columns = [c.lower()for c in pums.columns]
打印(pums.shape,“ \ n”)
打印(pums.columns,“ \ n”)
打印(pums.dtypes,“ \ n”)
feather.write_dataframe(pums,fthname)
普拉(小熊)
用于链接awk和python脚本的命令行。输出包括在内。具有13个属性的近1100万条记录-耗时70秒。
时间./pums.awk 2> null | python pums.py
(10925570,13)
索引(['serialno','division','puma','region','st','adjinc','agep','mar',
'schl','sex','hisp','pincp' ,'rac1p'],dtype
='object')
serialno int64
部门int64
puma int64
区域int64
st int64
邻接int64
agep int64
mar int64
schl int64
sex int64
hisp int64
pincp int64
rac1p int64 dtype
:object
    serialno  division  puma  region  st  ...  schl  sex  hisp  pincp  rac1p   
0 2013000000154 6 2500 3 1 ... 20 2 1 52000 2
1 2013000000154 6 2500 3 1 ... 16 1 1 99000 2
2 2013000000156 6 1700 3 1 ... 21 2 1 39930 2
3 2013000000160 6 2200 3 1 .. 。14 2 1 10300 3
4 2013000000160 6 2200 3 1 ... 16 1 1 1100 3
[5行x 13列]
           serialno  division  puma  region  ...  sex  hisp  pincp  rac1p   
10925565 2017001533765 8 300 4 ... 1 1 29800 1
10925566 2017001534830 8 200 4 ... 2 1 9000 1
10925567 2017001534957 8 300 4 ... 1 24 4000 1
10925568 2017001535265 8 200 4 ... 2 1 5000 9
10925569 2017001536156 8400 4 ... 1 1 2400 1
[5行x 13列]
真正的1m9.569s
用户1m1.576s
sys 0m2.359s
现在,使用R进行类似的练习。相同的pums.awk将提供R脚本。
pums.r
suppressMessages(库(readr))
suppressMessages(库(data.table))
suppressMessages(库(FST))
suppressMessages(库(羽毛))
wd <-“ c:/ bigdata / steve / awk”
setwd(wd)
fstnme <-“ pumsfst.fst”
fthnme <-“ pumsfth.feather”
f <-file(“ stdin”)
open(f)
pums <-data.table(read_csv(readLines(f,n = -1)))
setnames(pums,tolower(names(pums)))
print(dim(pums))
print(str(pums))
head(pums)
tail(pums)
write_fst(pums,fstnme)
write_feather(pums,fthnme)
命令行运行pums.awk并将管道输出到pums.r。输出包括在内。125秒,包括写入feather和fst文件。请注意,R读取器加载器做出的选择与熊猫不同。
时间./pums.awk 2> null | 脚本脚本
[1] 10925570 13类“ data.table”和“ data.frame”:10925570 obs。13个变量中:
serialno:num2.01e + 122.01e + 122.01e + 122.01e + 122.01e + 12 ... 除法:num 6 6 6 6 6 6 6 6 6 6 6 ...
puma:chr“ 02500”“ 02500 “” 01700“” 02200“ ... 区域:编号3 3 3 3 3 3 3 3 3 3 ... ...
st:chr” 01“” 01“” 01“” 01“ ... 编号:num 1061971 1061971 1061971 1061971 1061971 ...
agep:num55566361207881595670 ...  mar:num 1 1 3 4 5 2 2 1 1 1 ...
schl:chr“ 20”“ 16”“ 21”“ 14” ... 性别:num 2 1 2 2 1 2 2 1 2 1 ...
hisp:chr“ 01”“ 01”“ 01”“ 01” ...  pincp:chr“ 000052000”“ 000099000”
attr(*,“ .internal.selfref”)=
serialno部门puma地区st adjinc agep mar schl性别hisp pincp
1:2.013e + 12 6 02500 3 01 1061971 55 1 20 2 01 000052000
2:2.013e + 12 6 02500 3 01 1061971 56 1 16 1 01 000099000
3:2.013e + 12 6 01700 3 01 1061971 63 3 21 2 01 000039930
4:2.013e + 12 6 02200 3 01 1061971 61 4 14 2 01 000010300
5:2.013e + 12 6 02200 3 01 1061971 20 5 16 1 01 000001100
6:2.013e + 12 6 02400 3 01 1061971 78 2 01 2 01 000003900
rac1p 1:2
2:2
3:2
4:3
5:3
6:2
serialno division  puma region st  adjinc agep mar schl sex hisp
1:2.017002e + 12 8 00500 4 56 1011189 51 3 20 1 01
2:2.017002e + 12 8 00300 4 56 1011189 19 5 18 1 01
3:2.017002e + 12 8 00200 4 56 1011189 20 5 19 2 01
4: 2.017002e + 12 8 00300 4 56 1011189 18 5 16 1 24
5:2.017002e + 12 8 00200 4 56 1011189 31 5 18 2 01
6:2.017002e + 12 8 00400 4 56 1011189 60 3 19 1 01
pincp rac1p
1:000035300 1
2:000029800 1
3:000009000 1
4:000004000 1
5:000005000 9
6:000002400 1
实际1m53.440s
用户1m0.655s
sys 0m2.779s
最后,使用关联数组的更复杂的pums.awk。这适用于使用上述pums.py和pums.r的命令行。
pums.awk
gawk -F,'BEGIN {OFS =“,”} NR == 1 {split($ 0,dict,“,”); for(d in dict)newdict [dict [d]] = d} \(NR = = 1 || FNR!= 1)&&($ newdict [“ AGEP”]> = 18 && $ newdict [“ PINCP”]> 1000)\ $ newdict [“ SERIALNO”],$ newdict [“ DIVISION”],$ newdict [“区域”],$ newdict [“ ST”],$ newdict [“ PUMA”],$ newdict [“ AGEP”],$ newdict [“ HICOV”],\ $ newdict [“ MAR”],$ newdict [“ RAC1P”],$ newdict [“ HISP”],$ newdict [“ SEX”],$ newdict [“ SCHL”],$ newdict [“ PINCP”],$  newdict [“ ADJINC”]}'psam_pusa.csv psam_pusb.csv psam_pusc.csv psam_pusd.csv
好玩 我认为尘土飞扬的AWK确实可以在2019年数据管道中发挥重要作用-只要它被简单使用并发挥其投影/过滤优势即可。现在就这样。前往十月节。快乐的争吵!?
以下使用的技术是Windows 10,JupyterLab 0.35.4,Anaconda Python 3.7.3,Pandas 0.24.2,R 3.6.0,Cgywin 3.0.7和GNU Awk(gawk)5.0.1。所有的gawk,python和R脚本只是Cgywin窗口中bash shell命令行生成的管道中的组件。

关注 CDA人工智能学院 ,回复“录播”获取更多人工智能精选直播视频!


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:Functions Dataframe messages Division warnings

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-30 10:28