【问题标题】:group columns and get specific value in shell对列进行分组并在 shell 中获取特定值
【发布时间】:2017-01-17 02:07:34
【问题描述】:

我有一个文件,其中我必须对第 1,2 和 3 列进行分组,对第 7 列求和,得到计数,并得到具有最新日期时间的第 4 列和第 5 列(第 6 列)。

文件.txt

 AAA,BBB,CCC,OOO,PPP,20170117012006,12
 XXX,YYY,MMM,OOO,PPP,20170117012006,13
 AAA,BBB,CCC,III,TTT,20170117020006,14
 XXX,YYY,MMM,OOO,PPP,20170117022067,10

预期输出

 AAA,BBB,CCC,III,TTT,26,2
 XXX,YYY,MMM,OOO,PPP,23,2

我在这里有一个代码,但只对第 1、2、3 列进行分组。

awk 'BEGIN { FS=OFS=SUBSEP=","}{arr[$1,$2,$3]+=$7 }{arr2[$1,$2,$3]++}END {for (i in arr) print i,arr[i],arr2[i]}' FILE.txt

【问题讨论】:

    标签: bash shell awk ksh


    【解决方案1】:

    使用额外的数组来保存每个组的最新信息。

    awk 'BEGIN { FS=OFS=SUBSEP="," }
        {
            arr[$1,$2,$3]+=$6; 
            arr2[$1,$2,$3]++;
            if ($6 > latest[$1,$2,$3]) {
                latest[$1,$2,$3] = $6;
                latest_data[$1,$2,$3] = $4 OFS $5;
            }
        }
        END {for (i in arr) print i,arr[i],arr2[i],latest_data[i]}' FILE.txt
    

    【讨论】:

      【解决方案2】:

      @User101:尝试以下操作,它将为您提供预期/请求的输出以及与每个 Input_file 相同的 $1、$2、$3 的相同序列。

      awk -F, 'FNR==NR{A[$1,$2,$3]=A[$1,$2,$3]?A[$1,$2,$3]+$7:$7;;B[$1,$2,$3]++;next} (($1,$2,$3) in A){$NF="";print $0 A[$1,$2,$3] "," B[$1,$2,$3];delete A[$1,$2,$3]}' OFS=, SUBSUP=,   Input_file  Input_file
      

      将字段分隔符设为“,”。当读取第一个文件时,FNR==NR 将为 TRUE。创建名为 A 的数组,其索引为 $1,$2,$3 并将 $7 的值连接到它。再创建一个名为 B 的数组,其索引也是 $1,$2,$3 以计算 $1,$2,$3。

      然后检查 A 中的 ($1,$2,$3) 如果数组 A 中存在第一个、第二个、第三个字段,如果是,则打印当前行(我们将其最后一个字段设为 NULL)以及数组 A 和数组B 的值根据要求。

      编辑:现在添加非单线形式的解决方案太成功了。

      awk -F, 'FNR==NR{
                       A[$1,$2,$3]=A[$1,$2,$3]?A[$1,$2,$3]+$7:$7;
                       B[$1,$2,$3]++;
                       next
                      }
                      (($1,$2,$3) in A){
                                              $NF="";
                                              print $0 A[$1,$2,$3] "," B[$1,$2,$3];
                                              delete A[$1,$2,$3]
                                       }
              ' OFS=, SUBSUP=,  Input_file  Input_file
      

      【讨论】:

        【解决方案3】:
        awk -F"," '                     
        {
            i=$1","$2","$3
            if (i in a) {
                split(a[i],r,",")
                $7+=r[4]                    
                c=r[5]+1                  
                if (r[1] > $6) { $4=r[2]; $5=r[3]; $6=r[1] }
            } else { c=1 }
        
            a[$1","$2","$3]=$6","$4","$5","$7","c
        
        } END { for (i in a) { print i substr(a[i],15) }} 
        ' file
        
         AAA,BBB,CCC,III,TTT,26,2
         XXX,YYY,MMM,OOO,PPP,23,2
        

        如果您希望对第 1,2 和 3 列进行排序,请改用它

        END { asorti(a,b); for (i in b) { print b[i] substr(a[b[i]],15) }} 
        

        【讨论】:

          猜你喜欢
          • 2017-07-20
          • 2019-01-14
          • 1970-01-01
          • 1970-01-01
          • 2021-11-16
          • 1970-01-01
          • 1970-01-01
          • 2020-03-13
          • 2015-11-02
          相关资源
          最近更新 更多