2017-01-17 5 views
1

Ich habe eine Datei, in der ich Spalten gruppieren 1,2 & 3, Summe Spalte 7, erhalten Sie die Anzahl, und erhalten Spalte 4 und 5 mit spätester Datetime (Spalte 6).Gruppenspalten und erhalten spezifischen Wert in der Shell

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 

ERWARTETES ERGEBNIS

AAA,BBB,CCC,III,TTT,26,2 
XXX,YYY,MMM,OOO,PPP,23,2 

ich einen Code hier haben, aber nur 1,2,3 Gruppen Spalten.

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 

Antwort

0

Verwenden Sie zusätzliche Arrays, um die neuesten Informationen für jede Gruppe zu speichern.

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 
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 

Wenn Sie Spalten wollen 1,2 & 3 sortiert, dann ist diese anstelle

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

@ User101: Versuchen Sie folgende, es wird Ihnen erwartet/angeforderte Ausgabe zusammen mit dem gleichen Sequenz von $ 1, $ 2, $ 3 wie nur für Input_file.

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 

Feldtrennzeichen als ",". FNR == NR wird TRUE, wenn die allererste Datei gelesen wird. Erstellen Array namens A, deren Index ist $ 1, $ 2, $ 3 und es wird den Wert von $ 7 zu ihm verketten. Erstellen eines weiteren Arrays mit dem Namen B, dessen Index ebenfalls $ 1, $ 2, $ 3 für die Zählung von $ 1, $ 2, $ 3 ist.

Dann Überprüfung ($ 1, $ 2, $ 3) in A, wenn erste, zweite, dritte Feld in Array A vorhanden sind, wenn ja, dann Drucken der aktuellen Zeile (wessen letztes Feld haben wir es als NULL gemacht) zusammen mit Array A und Array B's Werte wie pro Anfrage.

EDIT: Hinzufügen von nicht ein Liner Form der Lösung jetzt erfolgreich.

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 
Verwandte Themen