对列进行分组并在 shell 中获取特定值

group columns and get specific value in shell

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

FILE.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[,,]+= }{arr2[,,]++}END {for (i in arr) print i,arr[i],arr2[i]}' FILE.txt

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

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

    a[","","]=","","","","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) }} 

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

awk -F, 'FNR==NR{A[,,]=A[,,]?A[,,]+:;;B[,,]++;next} ((,,) in A){$NF="";print [=10=] A[,,] "," B[,,];delete A[,,]}' 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 的值根据请求。

编辑: 添加 non-one 线性形式的解决方案现在太成功了。

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