staging.inyokaproject.org

Sortierung einer Zeile

Status: Gelöst | Ubuntu-Version: Kein Ubuntu
Antworten |

skapi85

Anmeldungsdatum:
19. August 2017

Beiträge: 48

Hallo,

ich habe hier eine Zeile die z.B. so aussieht

1
sort_weight={'alpha': {'sort': 10}, 'beta': {'sort': 20}, 'gamma': {'sort': 30}, 'delta': {'sort': 40},'epsilon': {'sort': 50}, 'zeta': {'sort': 60}}

Es gibt nun zwei Szenarien die Eintreten können (testA & testB sollen immer folgende Werte bekommen: 'testA': {'sort': 10}, 'testB': {'sort': 20}) :

A) testA & testB ist im String angeführt z.B. so

1
sort_weight={'alpha': {'sort': 10}, 'beta': {'sort': 20}, 'gamma': {'sort': 30}, 'delta': {'sort': 40},'epsilon': {'sort': 50},'testB': {'sort': 60}, 'zeta': {'sort': 70},'testA': {'sort': 80}}

B) testA & testB ist nicht im String enthalten

Das Problem ist nun dass das Ergebnis so aussehen soll

1
sort_weight={'testA': {'sort': 10}, 'testB': {'sort': 20}, 'alpha': {'sort': 30}, 'beta': {'sort': 40}, 'gamma': {'sort': 50}, 'delta': {'sort': 60},'epsilon': {'sort': 70}, 'zeta': {'sort': 80}}

Hat jemand einen Tipp wie ich am besten zu dem o.a. Ergebnis komme?

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

Mir ist anhand der Beschreibung der Algorithmus noch nicht ganz klar - verstehe ich das richtig, dass die Werte bereits sortiert und die Werte für sort immer Vielfache von 10 sind und du dann testA und testB davor einordnen willst und für die gesamte Folge der Wert von sort bei 10 beginnend als Vielfache von 10 hochgezählt wird?

Mit Python 3 sähe das z.B. so aus:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#!/usr/bin/env python3
sort_weight={'alpha': {'sort': 10}, 'beta': {'sort': 20}, 'gamma': {'sort': 30}, 'delta': {'sort': 40},'epsilon': {'sort': 50}, 'zeta': {'sort': 60}}

for n, key in enumerate(('testA', 'testB')):
    sort_weight[key] = {'sort': n}

result = {}
for n, item in enumerate(
     sorted(sort_weight.items(),
            key=lambda k_v: k_v[1]['sort']), start=1):
    key, value = item
    result[key] = {'sort': n * 10}

print(result)

skapi85

(Themenstarter)

Anmeldungsdatum:
19. August 2017

Beiträge: 48

@seahawk1986

Du hast absolut Recht! Der Sting ist vorsortiert. Würde ich testA & testB einfach einfügen (wenn diese im String nicht vorhanden sind), würde es zum Konflikt kommen da jeweils "'sort': 10" & "'sort': 20" zweimal vorkommen würde bzw. wenn testA & testB im String schon vorhanden ist, müsste die Sortierung neu gemacht werden.

Achja, ich würde das ganze gerne in BASH umsetzten.

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

In dem Fall könnte man das lösen, ohne die verhunzten JSON-Daten (die Strings haben Single- statt Double-Quotes) "ordentlich" zu parsen, wenn einen nur die Reihenfolge der Keys in der ersten Objektebene interessiert:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#!/bin/bash
a="sort_weight={'alpha': {'sort': 10}, 'beta': {'sort': 20}, 'gamma': {'sort': 30}, 'delta': {'sort': 40},'epsilon': {'sort': 50}, 'zeta': {'sort': 60}}"
b="sort_weight={'alpha': {'sort': 10}, 'beta': {'sort': 20}, 'gamma': {'sort': 30}, 'delta': {'sort': 40},'epsilon': {'sort': 50},'testB': {'sort': 60}, 'zeta': {'sort': 70},'testA': {'sort': 80}}"

for data in "$a" "$b"; do
    r=('testA' 'testB')
    while read -r key; do
        r+=("$key")
    done < <(grep -Po "(?<=')(?!sort|testA|testB)\S*?(?=')" <<< "$data")
    i=1
    echo -n "${data%=*}="
    for key in "${r[@]}"; do
         printf "'%s': {'sort': %d}, " "$key" $(( i * 10 ))
         (( i++ ))
    done | sed 's/, $//'
    echo "}"
done

Das liefert dann:

$ bash transform.sh                                                                                                                                                        
sort_weight={'testA': {'sort': 10}, 'testB': {'sort': 20}, 'alpha': {'sort': 30}, 'beta': {'sort': 40}, 'gamma': {'sort': 50}, 'delta': {'sort': 60}, 'epsilon': {'sort': 70}, 'zeta': {'sort': 80}}
sort_weight={'testA': {'sort': 10}, 'testB': {'sort': 20}, 'alpha': {'sort': 30}, 'beta': {'sort': 40}, 'gamma': {'sort': 50}, 'delta': {'sort': 60}, 'epsilon': {'sort': 70}, 'zeta': {'sort': 80}} 

skapi85

(Themenstarter)

Anmeldungsdatum:
19. August 2017

Beiträge: 48

Wow!! Genau so ist es Perfekt!! Vielen Dank für deine Mühen!!

Antworten |