2016-05-31 5 views
0

Ich habe eine Datei mit 5 Spalten im folgende Format:Finding Summe basierend auf mehreren Spalten aus einer Datei und zeigt den höchsten Wert und die entsprechende Zeile awk mit

$cat test.txt 
id;section;name;val1;val2 
11;10;John;50;15 
12;20;Sam;40;20 
13;30;Jeny;30;30 
14;10;Ted;60;10 
15;10;Mary;30;5 
16;20;Tim;15;15 
17;30;Pen;20;100 

ich die Daten in dem verarbeitenden Datei basierend auf der section_number (Spalte 2) übergeben. Und ich möchte die ID, Name, Total (Spalte4 + Spalte5) für die Section_id übergeben. Am Ende möchte ich die Zeileninformation drucken, die die höchste Summe hat.

Ich habe bereits ein awk Befehl wie folgt:

section=10 ; awk -F";" -v var="$section" 'BEGIN { print "id Name Total" } { if ($2 == var) { sum = $4 + $5 ;print $1 " "$3 " " sum ;if (sum>newsum) {newsum=sum;name=$3;id=$1}}} END { print "Max sum for section "var" is "newsum " for Name: " name " and ID: " id }' test.txt; 

und es ist die Anzeige von Daten wie folgt:

id Name Total 
11 John 65 
14 Ted 70 
15 Mary 35 
Max sum for section 10 is 70 for Name: Ted and ID: 14 

Aber wie das Szenario zu behandeln, wenn es mehrere Datensätze mit den sind derselbe höchste Wert wie Total?

+0

Es hängt alles davon ab, wie Sie behandeln möchten es ich denke? Man könnte sagen, dass der erste Precedens '>', der letzte '> =' oder beide durch Verwendung von Arrays erhält. – andlrc

+0

Es kann eine beliebige Anzahl von Zeilen für jeden Abschnitt mit demselben Gesamtwert geben. Also, wie alle diejenigen zu verfolgen, um am Ende zu drucken? Zum Verfolgen eines Gesamtwertes habe ich wie oben getan. Aber für mehrere gleiche Werte bin ich nicht so vertraut mit awk und Arrays. –

+0

Für die Eingabe "ID; Abschnitt; Name; Val1; Val2 11; 10; John; 50; 15 12; 20; Sam; 40; 20 13; 30; Jeny; 30; 30 14; 10; Ted ; 60; 10 15; 10; Mary; 30; 5 16; 20; Tim; 15; 15 17; 30; Kugelschreiber; 20; 100 18; 10; Mat; 25; 45' Ich bekomme einen falschen Ausgang 'ID Name Gesamt 11 John 65 14 Ted 70 15 Mary 35 18 Mat 70 Max Summe für Sektion 10 ist 70 für Name: Ted und ID: 14'. Für korrekte es muss die ID drucken: 18 auch in der Zusammenfassung –

Antwort

0

Es hängt alles davon ab, wie Sie es handhaben möchten, denke ich? Man könnte sagen, der erste erhält >, der letzte >= oder beides durch Verwendung von Arrays.

Angenommen, Sie alle mit der gleichen gemeinsamen höchsten Summe zeigen wollen:

% cat script.awk 
BEGIN { 
    FS=";"; 
    print "id Name Total"; 
} 
$2 != var {next}   # If line doesn't match skip blocks 
{ 
    sum = $4 + $5; 
    print $1 " " $3 " " sum; 
} 
sum > max {    # If sum > max we need to reset the arrays (names and ids) 
    max = sum;    # because we get a new winner 
    delete names; 
    delete ids; 
    l = 0; 
} 
sum >= max {    # If sum is same or higher than max we will need to add this 
    l++;      # to the list of winners. 
    names[l] = $3; 
    ids[l] = $1; 
} 
END { 
    printf "Max sum for section %s is %d for\n", var, max; 

    # Iterate though all "winners" and print them 
    for (i = 1; i <= l; i++) { 
    printf "Name: %s, ID: %s\n", names[i], ids[i]; 
    } 
} 

Hoffnung, das gibt Ihnen eine Vorstellung davon, wie Arrays zu verwenden.

und Laufen:

section=10; 
awk -F";" -v var="$section" -f script.awk test.txt 
#       ^Instead of having awk on command line use script.awk 
+0

Beim Versuch oben genannten Code bekomme ich unten errr 'awk: Syntaxfehler bei Quellzeile 12 Quelldatei script.awk Kontext ist \t Namen = >>> [< <<]; awk: illegale Anweisung an der Quellleitung 13 Quelldatei script.awk awk: illegale Anweisung an der Quellleitung 13 Quelldatei script.awk ' –

+0

Perfekt ..Es funktioniert für mich für die Beispieltests, die ich gemacht habe. Jetzt habe ich eine kleine Idee über Array Verwendung von oben awk Skript. Danke –

+1

@MathewsJose Ich bin froh, ich könnte helfen, sollten Sie darüber nachdenken, es zweimal zu lesen und dann schreiben Sie es selbst! Ich bin mir sicher, dass es so bleiben wird :-) – andlrc

Verwandte Themen