组列并获取shell中的特定值

时间:2017-01-17 02:07:34

标签: bash shell awk ksh

我有一个文件,其中我必须对第1,2和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[$1,$2,$3]+=$7 }{arr2[$1,$2,$3]++}END {for (i in arr) print i,arr[i],arr2[i]}' FILE.txt

3 个答案:

答案 0 :(得分:0)

使用其他数组来保存每个组的最新信息。

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

答案 1 :(得分:0)

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和2列3排序,然后使用此

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

答案 2 :(得分:0)

@ 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