Shell脚本以SUM为基础并通过基于两列的分组来查找MAX

时间:2016-08-09 05:12:17

标签: shell unix awk

我想知道是否有任何简单的方法来根据不同字段的分组来整理字段

例如 file1.txt包含以下数据

20160622|XXX1||50.00||50.00|MONEY|Plan1|
20160622|XXX1||100.00||100.00|MONEY|Plan1|
20160623|XXX1||25.00||25.00|MONEY|Plan1|
20160622|XXX2|||||MONEY|Plan4|
20160622|XXX3||20.00||20.00|MONEY|Plan5|

现在我想 根据COLUMN分组 - 2,3,5,7,8 与第4,6列相同 获取第1列的最大日期

预期输出:

20160623|XXX1||175.00||175.00|MONEY|Plan1|
20160622|XXX2|||||MONEY|Plan4|
20160622|XXX3||20.00||20.00|MONEY|Plan5|

1 个答案:

答案 0 :(得分:0)

这很简单但很傻。当然,如果你需要它,它不再是愚蠢的。在AWK:

$ cat > grouper.awk
{
    max1[$2,$3,$5,$7,$8]=(max1[$2,$3,$5,$7,$8]>$1?max1[$2,$3,$5,$7,$8]:$1)
    sum4[$2,$3,$5,$7,$8]+=$4
    sum6[$2,$3,$5,$7,$8]+=$6
    a[$2,$3,$5,$7,$8]=max1[$2,$3,$5,$7,$8] OFS $2 OFS $3 OFS sum4[$2,$3,$5,$7,$8] OFS $5 OFS sum6[$2,$3,$5,$7,$8] OFS $7 OFS $8
} 
END {
    for(i in a) 
        print a[i]
}

$ awk -F\| -v OFS=\| -f grouper.awk file
20160622|XXX3||20||20|MONEY|Plan5
20160623|XXX1||175||175|MONEY|Plan1
20160622|XXX2||0||0|MONEY|Plan4

所有总和必须在不同的数组中求和(当然,你可以使用多维数组),并且在数组索引中完成分组。