Awk 在Shell脚本中处理数据后生成新文件

Awk 在Shell脚本中处理数据后生成新文件,awk,grep,Awk,Grep,下面显示的输入文件是通过执行其他两个文件的结果生成的 i、 eawk'BEGIN{FS=OFS=“,”}FNR==NR{arr[$0];next}{print$1,$2,$3,$5,(arr中$4)?1:0}'$NGW_REG_RESP_FILE$NGW_REG_REQ_FILE>>$NGW_REG_REG_FILE $NGW_REG_文件包含以下数据,因此我必须创建一个新文件 2020-12-21,18,1,1,1 2020-12-21,18,1,1,0 2020-12-21,18,1,2,1

下面显示的输入文件是通过执行其他两个文件的结果生成的 i、 e
awk'BEGIN{FS=OFS=“,”}FNR==NR{arr[$0];next}{print$1,$2,$3,$5,(arr中$4)?1:0}'$NGW_REG_RESP_FILE$NGW_REG_REQ_FILE>>$NGW_REG_REG_FILE

$NGW_REG_文件包含以下数据,因此我必须创建一个新文件

2020-12-21,18,1,1,1
2020-12-21,18,1,1,0
2020-12-21,18,1,2,1
2020-12-21,18,1,2,1
2020-12-21,18,2,1,1
2020-12-21,18,2,1,1
2020-12-21,18,2,1,0
2020-12-21,18,3,2,1
2020-12-21,18,3,2,1
2020-12-21,18,4,2,0
2020-12-21,18,4,2,1
2020-12-21,18,3,2,0
这些数据表明:

Date,Hour,Quarter,ReqType,Success/failed
Reqtype there were 2 possibilities: 1-> incoming 2-> outgoing
last field: 1->success 0-> failed
Quarter -> 1,2,3,4
我想读取此文件并生成一个包含以下数据的新文件(我的输出文件):

**更新 评论中给出的答案正是我想要的。 我在示例输入文件中进行了一些更新,即在最后一列之前添加了一列,即
状态代码
,您可以在下面的输入I,e 200400300中看到

2020-12-21,18,1,1,200,1
2020-12-21,18,2,1,400,0
2020-12-21,18,2,1,300,0
现有代码在输出文件中给出以下结果: i、 e该季度成功/失败的总数。这是正确的

我想做的是在输出文件中添加一列,在失败总数旁边,即保存这些状态代码的数组

2020-12-21,18,1,1,1,0,[] //empty array in end bcs there is no failed req,1,success req
2020-12-21,18,2,1,0,2,[400,300] // here 2 failed req,0 success request
<DATE>,<HOUR>,<QUARTER>,<REQ_TYPE>,<SUCCESS_COUNT>,<FAIL_CNT>,<ARRAY_HOLDING_STATUSCODE>
使用awk(用于阵列排序的GNU awk):

说明:

awk -F, '{ 
           if ($NF==1) { 
              map[$1][$2][$3][$4]["success"]++ # If last field is 1, increment a success index in array map with other fields as further indexes
           }
           else { 
              map[$1][$2][$3][$4]["fail"]++ # Otherwise increment a fail index
           } 
          } 
      END { 
            PROCINFO["sorted_in"]="@ind_num_asc"; # Set the array ordering
            for (i in map) { 
             for (j in map[i]) { 
              for (k in map[i][j]) { 
                for (l in map[i][j][k]) { 
                   print i","j","k","l","(map[i][j][k][l]["success"]==""?"0":map[i][j][k][l]["success"])","(map[i][j][k][l]["fail"]==""?"0":map[i][j][k][l]["fail"]) # Loop through the array and print the data in the format required. If there is no entry in the success or fail index, print 0.
                } 
               } 
              } 
             } 
            }' $NGW_REG_FILE

所以如果季度是2,reqID是2,那么请求的数量是4?是这样吗?我们是否将这两个实例相乘以获得请求数?看起来除了概述需求之外,您还没有尝试过做很多事情来解决您的问题。您好,先生,上面的代码完全符合预期,非常感谢您的回答。关于解决问题的方法,我有一些问题想问您,您共享的代码完成了最后的任务。我将分享方法,如果有更好的解决方法,请纠正我,谢谢!你好@Raman我已经用小零钱更新了问题,你能检查一下并帮我解决吗
`cat $input_file | grep -v Orig | awk -F, '{ 
           if ($NF==1) { 
              map[$1][$2][$3][$4]["success"]++
           }
           else { 
              map[$1][$2][$3][$4]["fail"]++
              harish[$1][$2][$3][$4][$5]++ //ADDED THIS
           } 
          } 
      END { 
            PROCINFO["sorted_in"]="@ind_num_asc";
            for (i in map) { 
             for (j in map[i]) { 
              for (k in map[i][j]) { 
                for (l in map[i][j][k]) { 
                   print i","j","k","l","(map[i][j][k][l]["success"]==""?"0":map[i][j][k][l]["success"])","(map[i][j][k][l]["fail"]==""?"0":map[i][j][k][l]["fail"])
                } 
               } 
              } 
             } 
            }' >> OUTPUT_FILE.txt`
awk -F, '{ if ($NF==1) { map[$1][$2][$3][$4]["success"]++ } else { map[$1][$2][$3][$4]["fail"]++ } } END { PROCINFO["sorted_in"]="@ind_num_asc";for (i in map) { for (j in map[i]) { for (k in map[i][j]) { for (l in map[i][j][k]) { print i","j","k","l","(map[i][j][k][l]["success"]==""?"0":map[i][j][k][l]["success"])","(map[i][j][k][l]["fail"]==""?"0":map[i][j][k][l]["fail"]) } } } } }' $NGW_REG_FILE
awk -F, '{ 
           if ($NF==1) { 
              map[$1][$2][$3][$4]["success"]++ # If last field is 1, increment a success index in array map with other fields as further indexes
           }
           else { 
              map[$1][$2][$3][$4]["fail"]++ # Otherwise increment a fail index
           } 
          } 
      END { 
            PROCINFO["sorted_in"]="@ind_num_asc"; # Set the array ordering
            for (i in map) { 
             for (j in map[i]) { 
              for (k in map[i][j]) { 
                for (l in map[i][j][k]) { 
                   print i","j","k","l","(map[i][j][k][l]["success"]==""?"0":map[i][j][k][l]["success"])","(map[i][j][k][l]["fail"]==""?"0":map[i][j][k][l]["fail"]) # Loop through the array and print the data in the format required. If there is no entry in the success or fail index, print 0.
                } 
               } 
              } 
             } 
            }' $NGW_REG_FILE