【发布时间】:2014-09-28 16:22:01
【问题描述】:
问题:为什么在下面的代码段中似乎没有填充 date_list[d] 和 isin_list[i]?
-
AWK 代码(在 Win-7 机器上的 GNU-AWK 上)
BEGIN { FS = "," } # This SEBI data set has comma-separated fields (NSE snapshots are pipe-separated) # UPDATE the lists for DATE ($10), firm_ISIN ($9), EXCHANGE ($12), and FII_ID ($5). ( $17~/_EQ\>/ ) { if (date[$10]++ == 0) date_list[d++] = $10; # Dates appear in order in raw data if (isin[$9]++ == 0) isin_list[i++] = $9; # ISINs appear out of order in raw data print $10, date[$10], $9, isin[$9], date_list[d], d, isin_list[i], i } -
输入数据
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 -
我得到的输出
6/27/2003 1 INE239A01016 1 1 1 6/27/2003 2 INE047A01013 1 1 2 6/26/2003 1 INE040A01018 1 2 3 6/28/2003 1 INE585B01010 1 3 4 6/28/2003 2 INE585B01010 2 3 4 -
预期输出
据我所知,打印输出正确(i)$10(日期)(ii)日期[$10),每个日期的计数(iii)$9(称为 ISIN 的公司 ID)(iv ) isin[$9],每个 ISIN 的计数 (v) d(date_list 的索引,唯一日期的数量)和 (vi) i(isin_list 的索引,唯一 ISIN 的数量)。我还应该得到另外两列——下面的第 5 列和第 7 列——date_list[d] 和 isin_list[i],它们的值看起来像 $10 和 $9。
6/27/2003 1 INE239A01016 1 6/27/2003 1 INE239A01016 1 6/27/2003 2 INE047A01013 1 6/27/2003 1 INE047A01013 2 6/26/2003 1 INE040A01018 1 6/26/2003 2 INE040A01018 3 6/28/2003 1 INE585B01010 1 6/28/2003 3 INE585B01010 4 6/28/2003 2 INE585B01010 2 6/28/2003 3 INE585B01010 4
【问题讨论】:
-
您的
expected output部分中缺少数据?那会很有帮助。还要学习使用编辑框左上角的格式化工具{}。用鼠标突出显示应保持其原始格式的块,然后单击{}。 -
也就是说,我猜你正在使用
if (date[$10]++ == 0)(和类似的)来确定一个值是否已经在一个数组中。awk中针对该任务的标准解决方案写成if(!($10 in date)) { date[$10]++; date_list[d++]=$10 }祝你好运。 -
date_list[d]和isin_list[i]正在访问您刚刚存储的元素。试试date_list[d-1]和isin_list[i-1]。 -
如果 date[$10]++ 计数器已经为 1,则它不会增加它。我需要每个日期的计数器和 d,它告诉我唯一日期的数量。令我困惑的是,旧代码(或几乎完全相同的代码,也在 SO 档案中)运行良好。硬盘死机、重新安装等。我以为我没问题,但这个旧示例不再有效。
-
[d-1] 和 [i-1] 而不是 [d] 和 [i] 做到了。获得预期的输出。谢谢。 @ooga。只是不清楚为什么旧示例有效。
标签: awk associative-array