2016-08-09 52 views
-1

ich wissen will, ob es ein einfacher Ansatz ist ein Feld Gruppe von verschiedenen FeldernShell-Skript Summen- und findet MAX durch die Gruppierung basiert auf zwei Säulen

für beispielsweise basierend auf SUM file1.txt enthält unter Daten

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| 

Jetzt möchte ich Gruppe basiert, indem Sie auf Spalte - 2,3,5,7,8 SUM die Spalte 4,6 Get Max Datum Spalte 1

Ausgang Erwartet:

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

Wie ist Spalte 1 gruppiert? macht keinen sinn in ihrem i/p und o/p und was hast du probiert? – Inian

+1

Sie können mehr Flexibilität erhalten, indem Sie z. SQLite. Sie können ein Bash-Skript um SQLite ziemlich einfach schreiben. – Evert

Antwort

0

Es ist einfach, aber dumm ist. Natürlich, wenn Sie es brauchen, ist es nicht mehr dumm. In 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 

Alle Beträge müssen in verschiedenen Arrays zusammengefasst werden und die Gruppierung (Sie mehrdimensionale Arrays, natürlich nutzen könnten) in dem Array-Index durchgeführt.