带关联数组的Awk代码--数组不';似乎没有填充,但没有错误
问:为什么在下面的代码段中,日期列表[d]和isin列表[i]似乎没有填充带关联数组的Awk代码--数组不';似乎没有填充,但没有错误,awk,associative-array,Awk,Associative Array,问:为什么在下面的代码段中,日期列表[d]和isin列表[i]似乎没有填充 AWK代码(在Win-7机器上的GNU-AWK上) 输入数据 49290,C198962542782200306,6/30/2003,433581,F5811773991200306,S5405611832200306,B5086397478200306,NESTLE INDIA LTD.,INE239A01016,6/27/2003,1,E9035083824200306,REG_DL_STLD_02,591.13,
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
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
我现在使用的实际代码是
{ if (date[$10]++ == 0) date_list[d++] = $10;
if (isin[$9]++ == 0) isin_list[i++] = $9;}
( $11~/1|2|3|5|9|1[24]/ )) { ++BNR[$10,$9,$12,$5]}
END { { for (u = 0; u < d; u++)
{for (v = 0; v < i; v++)
{ if (BNR[date_list[u],isin_list[v]]>0)
BR=BNR[date_list[u],isin_list[v]]
{ print(date_list[u], isin_list[v], BR}}}}}
{if(date[$10]+==0)date_list[d++]=$10;
如果(isin[$9]++==0)isin_列表[i++]=$9;}
($11~/1 | 2 | 3 | 5 | 9 | 1[24]/){++BNR[$10,$9,$12,$5]}
结束{(u=0;u0)
BR=BNR[date\u list[u],isin\u list[v]]
{打印(日期列表[u],isin列表[v],BR}}
非常感谢大家。您的
预期输出
部分缺少数据?这会很有帮助。还要学习使用编辑框左上角的格式化工具{}
。用鼠标突出显示应保持其原始格式的块,然后单击{}
。也就是说,我猜您正在使用if(date[$10]+==0)
(和类似)来确定值是否已经在数组中。该任务的awk
中的std解决方案编写为if(!($10 in date)){date[$10]++;date list[d++]=$10}
祝您好运。date list[d]
和isin\list[I]
正在访问刚存储的元素的一个。请尝试日期列表[d-1]
和isin\U列表[i-1]
。如果日期[$10]++计数器已经是1,则这不会增加它。我需要为每个日期都设置一个计数器,还需要一个d,它告诉我唯一日期的数量。让我困惑的是,旧代码(或者类似的东西,也在SO档案中)运行良好。硬盘死机、重新安装等。我认为我还可以,但这个旧示例不再有效。[d-1]和[I-1],而不是[d]和[I]完成了。获得了预期的输出。谢谢。@ooga。我只是不清楚为什么旧示例有效。这是问题的解决方案还是更新?如果是第一个,请标记为已接受,以便将来读者清楚;如果是后者,请将其添加到您的问题中。
{ if (date[$10]++ == 0) date_list[d++] = $10;
if (isin[$9]++ == 0) isin_list[i++] = $9;}
( $11~/1|2|3|5|9|1[24]/ )) { ++BNR[$10,$9,$12,$5]}
END { { for (u = 0; u < d; u++)
{for (v = 0; v < i; v++)
{ if (BNR[date_list[u],isin_list[v]]>0)
BR=BNR[date_list[u],isin_list[v]]
{ print(date_list[u], isin_list[v], BR}}}}}