我有一个文件,其中我必须对第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
答案 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