Analysieren Sie Daten anhand der Anzahl der Ziffern in Anführungszeichen

Analysieren Sie Daten anhand der Anzahl der Ziffern in Anführungszeichen

Ich habe derzeit eine große Menge an Daten im aktuellen Format:

a:7:{i:0;s:4:"9999";i:1;s:4:"10000";i:2;s:4:"10001";i:3;s:4:"10002";i:4;s:4:"10003";i:5;s:4:"10004";i:6;s:4:"989";}

Die Zahlen ""davor haben s:4. Für Zahlen mit 3 Ziffern sollte dies in geändert werden s:3, für Zahlen mit 5 Ziffern sollte dies sein s:5und so weiter.

Die konvertierten Daten sollten folgendermaßen aussehen:

a:7:{i:0;s:4:"9999";i:1;s:5:"10000";i:2;s:5:"10001";i:3;s:5:"10002";i:4;s:5:"10003";i:5;s:5:"10004";i:6;s:3:"989";}

Jeder Datenstring {}steht in einer eigenen Zeile indata.txt

Antwort1

Wie wäre es mit

perl -pe 's/s:\d+:"(.*?)"/sprintf("s:%d:\"%s\"",length($1),$1)/ge'

Ex.

$ echo 'a:7:{i:0;s:4:"9999";i:1;s:4:"10000";i:2;s:4:"10001";i:3;s:4:"10002";i:4;s:4:"10003";i:5;s:4:"10004";i:6;s:4:"989";}' | 
    perl -pe 's/s:\d+:"(.*?)"/sprintf("s:%d:\"%s\"",length($1),$1)/ge'
a:7:{i:0;s:4:"9999";i:1;s:5:"10000";i:2;s:5:"10001";i:3;s:5:"10002";i:4;s:5:"10003";i:5;s:5:"10004";i:6;s:3:"989";}

Sie können hinzufügen -i, dass die Ersetzung direkt in der Datei durchgeführt wird.

Antwort2

#!/usr/bin/env bash

IFS=';'

while read LINE
do

        set -- $LINE

        while [ "$1" ]
        do
                if [[ $1 =~ ^s:[0-9]+:\".*\"$ ]]; then
                        s=${1##*:}
                        printf 's:%d:%s%s' $((${#s}-2)) "$s" "$IFS"
                else
                        printf '%s%s' "$1" "$IFS"
                fi
                shift

        done
        printf '\n'

done < data.txt

Dieses Skript setzt das Feldtrennzeichen auf das Semikolon und durchläuft dann die Zeilen von data.txt, wobei jede Zeile am Semikolon-Trennzeichen in separate Felder aufgeteilt wird. Für Felder, die mit beginnen s:###:"..."(für beliebige Werte von ###und ...), berechnet das Skript die Länge der in Anführungszeichen gesetzten Zeichenfolge und formatiert das Feld mit diesem Längenwert neu und fügt ein abschließendes Feldtrennzeichen hinzu. Felder, die nicht dem Format entsprechen, s:###:"..."werden unverändert ausgegeben, wobei das abschließende Feldtrennzeichen erneut hinzugefügt wird.

a:7:{i:0;s:4:"9999";i:1;s:5:"10000";i:2;s:5:"10001";i:3;s:5:"10002";i:4;s:5:"10003";i:5;s:5:"10004";i:6;s:3:"989";};

verwandte Informationen