是一个AWK新手,使用移植到Windows(GNXUtils)和gawk而不是awk的GNU实用程序.这个论坛上的解决方案就像绝对的魔术一样,我试图找到一个我可以阅读的来源,以更好地理解该解决方案中提供的模式表达.
在UNIX shell脚本中从列表中选择唯一值或不同值时, Dimitre Radoulov的答案提供以下代码
zsh-4.3.9[t]% awk '!_[$0]++' file
Run Code Online (Sandbox Code Playgroud)
作为选择具有重复和混杂元素的列表元素的解决方案,仅列出每个元素一次.
我以前曾经sort | uniq这样做过,这对小型测试文件很有用.对于我的实际问题(从2006年4月的印度国家证券交易所16天的档案订单研究数据中提取公司符号列表,在多个文件中提供了12,000多万条记录),分类负担变得过大.uniq只消除了相邻的重复项.
我使用了复制上面的Win-GNU gawk行
C:\Users\PAPERS\> cat ..\Full*_Symbols.txt | gawk "!_[$0]++" | wc -l
946
Run Code Online (Sandbox Code Playgroud)
建议有9,900多万条记录涉及946家不同的公司,这是一个非常合理的答案.在我的适度Windows机器上花了不到5分钟,经过几个小时的尝试SORT让我失望.
看了我所有的awk文本并在网上搜索了一下,而对于模式的一部分,为什么它工作的解释是明确的(!作为NOT,$0是整个当前记录),对于_我无法找到的下划线任何解释,并++在示例中仅作为"用1更新计数器".
将非常感谢任何适当的文本或网络参考,以充分理解这个例子,因为我认为它也将帮助我在其他相关的情况下.谢谢.最好,
这与我最近在关联数组的awk代码中的帖子有关 - 数组似乎没有填充,但没有错误,也没有优化循环,从外部文件传递参数,在awk中命名数组参数
我在这里的基本问题是简单地从古代的详细档案金融市场数据,#transactions的每日汇总,#shares,价值,按日期来计算,企业-ID,交换等学会了awk来用关联数组实现这一点,是很高兴能够在11分钟的时钟时间内处理9,900多万行.直到我喝完咖啡之前.
变得更加雄心勃勃,从2个阵列下标转移到4个,现在我无法一次处理超过6500行.
获取表单的错误消息:
K:\用户文件夹\ KRISHNANM\PAPERS\FII_Transaction_Data> zcat RAW_DATA\2003_1.zip | gawk -f CODE\FII_daily_aggregates_v2.awk> OUTPUT\2003_1.txt&
gawk:CODE\FII_daily_aggregates_v2.awk:33:(FILENAME = - FNR = 49300)致命:more_no des:nextfree:无法分配内存(空间不足)
在一些运行中,机器告诉我它缺少52 KB的内存.我对Win-7和8MB RAM的std配置有所了解.
(经济学家通过培训,而不是计算机科学家.)我意识到,从2到4阵列使计算机上的问题在计算上变得更加复杂,但是有一些人可以做些什么来改善内存管理至少一点点.我试过关闭我正在做的其他事情.该错误始终只与内存有关,从不与磁盘空间或其他任何内容有关.
示例INPUT:
49290,C198962542782200306,6/30/2003,433581,F5811773991200306,S5405611832200306,B5086397478200306,NESTLE INDIA LTD.,INE239A01016,6/27/2003,1,E9035083824200306,REG_DL_STLD_02,591.13,5655,3342840.15,REG_DL_INSTR_EQ,REG_DL_DLAY_P,DL_RPT_TYPE_N,DL_AMDMNT_DEL_00
49291,C198962542782200306,6/30/2003,433563,F6292896459200306,S6344227311200306,B6110521493200306,GRASIM INDUSTRIES LTD.,INE047A01013,6/27/2003,1,E9035083824200306,REG_DL_STLD_02,495.33,3700,1832721,REG_DL_INSTR_EQ,REG_DL_DLAY_P,DL_RPT_TYPE_N,DL_AMDMNT_DEL_00
49292,C198962542782200306,6/30/2003,433681,F6513202607200306,S1724027402200306,B6372023178200306,HDFC BANK LTD,INE040A01018,6/26/2003,1,E745964372424200306,REG_DL_STLD_02,242,2600,629200,REG_DL_INSTR_EQ,REG_DL_DLAY_D,DL_RPT_TYPE_N,DL_AMDMNT_DEL_00
49293,C7885768925200306,6/30/2003,48128,F4406661052200306,S7376401565200306,B4576522576200306,Maruti Udyog Limited,INE585B01010,6/28/2003,3,E912851176274200306,REG_DL_STLD_04,125,44600,5575000,REG_DL_INSTR_EQ,REG_DL_DLAY_P,DL_RPT_TYPE_N,DL_AMDMNT_DEL_00
49294,C7885768925200306,6/30/2003,48129,F4500260787200306,S1312094035200306,B4576522576200306,Maruti Udyog Limited,INE585B01010,6/28/2003,4,E912851176274200306,REG_DL_STLD_04,125,445600,55700000,REG_DL_INSTR_EQ,REG_DL_DLAY_P,DL_RPT_TYPE_N,DL_AMDMNT_DEL_00
49295,C7885768925200306,6/30/2003,48130,F6425024637200306,S2872499118200306,B4576522576200306,Maruti Udyog Limited,INE585B01010,6/28/2003,3,E912851176274200306,REG_DL_STLD_04,125,48000,6000000,REG_DL_INSTR_EU,REG_DL_DLAY_P,DL_RPT_TYPE_N,DL_AMDMNT_DEL_00
Run Code Online (Sandbox Code Playgroud)
码
BEGIN { FS = "," }
# For each array subscript variable -- DATE ($10), firm_ISIN ($9), EXCHANGE ($12), and FII_ID ($5), after checking for type = EQ, …Run Code Online (Sandbox Code Playgroud)