2016-09-23 7 views
1

I eine Reihe von Daten, wieSchlüsselwertpaare in awk

915 1.1.1.1 Sep 21 06 
2478 2.2.2.2 Sep 21 07 
1960 2.2.2.2 Sep 21 08 
500 1.1.1.1 Sep 21 09 

der gewünschte Ausgang ist wie folgt:

1.1.1.1 1415 
2.2.2.2 4438 

D.h. Addieren Sie die Zahlen in der ersten Spalte. Ich würde gerne awk Textverarbeitungssprache verwenden, um das gleiche zu erreichen. Meine Lösung dafür war:

echo " 915 1.1.1.1 Sep 21 06 
2478 2.2.2.2 Sep 21 07 
1960 2.2.2.2 Sep 21 08 
500 1.1.1.1 Sep 21 09" | awk '{arr[$2]=$1; if($2 in arr) {val = arr[$2] + $1; arr[$2]=val}} END {for (i in arr) {print i, arr[i]}}' 

Dies scheint nicht zu funktionieren. Ich bin mir nicht sicher, was ich falsch gemacht habe.

+0

'arr [$ 2] = $ 1; Wenn ($ 2 in arr) 'in dieser Reihenfolge Bedingung immer wahr sein wird und Sie die gleiche Zahl zweimal hinzufügen. – karakfa

+0

@CharlesDuffy: Danke für die Antwort. Das würde ein One-Liner sein. Ich plante kein Skript um das selbe, und ich schärfte meine awk-Kenntnisse *, die im Moment nicht viel ist *. – rickydj

Antwort

1

Da Sie diesen Bash getaggt haben, nehme ich an, dass eine native Antwort auch akzeptabel ist. Folgendes kann in bash 4.x oder höher kopiert-and-eingefügt werden und erfordert keine Werkzeuge außerhalb der Schale selbst:

s=' 915 1.1.1.1 Sep 21 06 
2478 2.2.2.2 Sep 21 07 
1960 2.2.2.2 Sep 21 08 
500 1.1.1.1 Sep 21 09' 

{ 
    declare -A data=() 
    while read -r size address _; do 
    [[ $address ]] || continue 
    ((data[$address]+=size)) 
    done 

    for k in "${!data[@]}"; do 
    v=${data[$k]} 
    printf '%s\t%s\n' "$k" "$v" 
    done 
} <<<"$s" 
2
$ awk '{a[$2]+=$1} END{for(k in a) print k,a[k] | "sort" }' file 

1.1.1.1 1415 
2.2.2.2 4438 
+0

Danke. +1 für deine Antwort. – rickydj

0

Es funktioniert. Halte es einfach.

$ echo " 915 1.1.1.1 Sep 21 06 
2478 2.2.2.2 Sep 21 07 
1960 2.2.2.2 Sep 21 08 
500 1.1.1.1 Sep 21 09" | awk '{ arr[$2] += $1 } END {for (i in arr) { print i, arr[i] } }' 

1.1.1.1 1415 
2.2.2.2 4438