带关联数组的Awk代码--数组不';似乎没有填充,但没有错误

带关联数组的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,

问:为什么在下面的代码段中,日期列表[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,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美元(公司ID称为ISIN)(iv)ISIN[$9),每个ISIN的计数(v)d(日期列表索引,唯一日期的数量)和(vi)I(ISIN列表索引,唯一ISIN的数量).我还应该为date_list[d]和isin_list[I]再增加两列,即下面的第5列和第7列,这两列的值类似于$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
    

  • 我现在使用的实际代码是

    {    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}}}}}