Bash sortieren

ClocxHD

Lt. Junior Grade
Registriert
Aug. 2014
Beiträge
376
Hallo,

in einer .ini-Datei werden Quotes abgespeichert.
Jeder Quote wird in eine neue Zeile geschrieben, und jede Zeile fängt mit quote_0= an.
Da diese vom Bot nicht in der richtigen Reihenfolge in die Datei geschrieben habe, sortiere ich die mit einem Bash-Script.
Das funktioniert auch soweit, jedoch Packt er quote_10 unter die 1, und nicht unter die 9.

Das Bash-Script:
Code:
rm -rf /var/sites/kamikathrin/app/data/quotes.ini
cp /var/server/bots/PhantomBot-WORK-INISTORE/inistore/quotes.ini /var/sites/kamikathrin/app/data
sort /var/sites/kamikathrin/app/data/quotes.ini -o /var/sites/kamikathrin/app/data/quotes.ini
chown -R wwwuser:wwwuser /var/sites/kamikathrin

LG,
ClocxHD
 
Ist ja eigentlich auch richtig so. Da es sich um so wenige (9) Datensätze handelt, frag ich mich ob es nicht reichen würde, diese manuell in 01 statt 1 zu ändern?
 
Die werden ja automatisch vom Bot so darein geschrieben, auch wenn ich die reihenfolge etc. änder, wird das beim nächsten mal wieder vertauscht.
 
Dann musst dir wohl ein eigenes Sortierprogramm schreiben.

1
10
2
20
21
22
9

Die Sortierung läuft schon richtig, weil ein Zeichen nach dem anderen verglichen wird und da zählt nunmal die erste Zahl. 9 > 1 also kommt 9 auch erst nach 1 und 10
 
Ich glaube, da wäre es sinvoller, den Bot umzuprogrammieren :/
 
das wäre sowieso die richtige Vorgehensweise, wenn du Zugriff auf den Code hast. Wenn man saubere Daten geliefert bekommt ist das natürlich immer besser, als wenn man sie danach erst mühsam aufbereiten muss.

Würde dann aber je nach Datenmenge gleich zu nem 3 oder 4 stellige Nummernschema wechseln.

also
0001
0002
0009
0010
 
Das habe ich kurz getestet. 'quote_' wegschneiden, dann mit sort -n numerisch sortieren, 'quote_' wieder einfügen.
Code:
sed 's/quote_//g' file | sort -n | sed 's/\(.*\)/quote_\1/g' > file_sorted
 
Ich weiß nicht, ob das so nett ist, jetzt einfach die Scriptsprache zu ändern, aber ich mache es mal :D

Der entsprechende JavaScript-Code vom Bot:
Code:
        if (args[0].equalsIgnoreCase("add")) {
            if (!$.isModv3(sender, event.getTags())) {
                $.say($.getWhisperString(sender) + $.modmsg);
                return;
            }
            if (args.length < 2) {
                $.say($.getWhisperString(sender) + $.lang.get("net.phantombot.quotecommand.error-quote-usage"));
                return;
            }
            $.inidb.incr("quotes", "num_quotes", 1);
            $.inidb.set("quotes", "quote_" + quotes, message + quoteInfo);
            $.say($.getWhisperString(sender) + $.lang.get("net.phantombot.quotecommand.quote-add-success", message));
        }

Würde das folgendermaßen funktionieren, dass er die Quotes, die kleiner als 10 sind, mit 01, 02 etc. hoch zählt?:

Code:
        if (args[0].equalsIgnoreCase("add")) {
            if (!$.isModv3(sender, event.getTags())) {
                $.say($.getWhisperString(sender) + $.modmsg);
                return;
            }
            if (args.length < 2) {
                $.say($.getWhisperString(sender) + $.lang.get("net.phantombot.quotecommand.error-quote-usage"));
                return;
            }
            if ($.inidb.get("quotes", "num_quotes") <= 9) {
            	$.inidb.incr("quotes", "num_quotes", 01);
                return;
            } else {
            	$.inidb.incr("quotes", "num_quotes", 1);
            	return;
            }         
            $.inidb.set("quotes", "quote_" + quotes, message + quoteInfo);
            $.say($.getWhisperString(sender) + $.lang.get("net.phantombot.quotecommand.quote-add-success", message));
        }

(Die Zeilen mit dem $.inidb.incr)
Ergänzung ()

@fhtagn: Das 'quote_' muss in der Zieldatei nicht dazu, also würde dieser Schritt wegfallen. Würde er es damit entsprechend sortieren?
 
@ClocxHD das funktioniert. Bleibt also dann:
Code:
sed 's/quote_//g' file | sort -n > file_sorted
 
Hallo,

jetzt sieht die Bash-Datei so aus:
Code:
rm -rf /var/sites/kamikathrin/app/data/quotes.ini
cp /var/server/bots/PhantomBot-WORK-INISTORE/inistore/quotes.ini /var/sites/kamikathrin/app/data
sed 's/quote_//g' /var/sites/kamikathrin/app/data/quotes.ini | sort -n > /var/sites/kamikathrin/app/data/quotes.ini
chown -R wwwuser:wwwuser /var/sites/kamikathrin

Jedoch ist die Zieldatei jetzt leer.
 
also
Code:
sort -V (/var/server/bots/PhantomBot-WORK-INISTORE/inistore/quotes.ini)
erzeugt bei mir direkt das gewünschte
 
Man kann in einer Pipe nicht am Anfang aus einer Datei lesen und am Ende in die selbe Datei zurückschreiben.
Mach's so wie rumbalotte schreibt, mit -V und -o.
 
@ClocxHD
in Zeile 3 kümmert sich die Bash zuerst um die Ausgabeumleitung, d.h. es legt eine leere Datei an. Da diese Datei schon existiert wird diese mit einer leeren Datei überschrieben.
Erst danach wird sed und sort ausgeführt. Da sed und dann sort mit den Daten aus einer leeren Datei arbeiten ist Datei in die die Ausgabe erfolgt hinterher auch leer.

Vereinfachtes Beispiel:
In einem leeren Verzeichnis folgendes ausführen und danach den Inhalt der erzeugten Datei ansehen.
Code:
ls >RateWelchenInhaltHabeIch.txt

Wenn Du die Zeile 3 änderst indem Du die sort mit -o für eine Ausgabedatei benutzt sollte das auch ohne Temp-Datei gehen.
Code:
sed 's/quote_//g' /var/sites/kamikathrin/app/data/quotes.ini | sort -n -o /var/sites/kamikathrin/app/data/quotes.ini
 
Hallo,

ich habe jetzt mal den Code von @HDScratcher eingebaut, es funktioniert perfekt, vielen Dank!
Wie sieht das aus, wenn die Quotes die ID 100 erreichen?
Funktioniert das dann noch weiterhin?

LG,
ClocxHD
 
Was du willst ist genau das von rumbalotte vorgeschlagene version sort. Also nimm das und freu dich, dass sich schon jemand anders über alle möglichen Randfälle Gedanken gemacht hat.
 
Wenn ich das versuche, bekomme ich folgende Meldung:
Code:
./copy_quotes.sh: Zeile 4: Syntaxfehler beim unerwarteten Wort `('
./copy_quotes.sh: Zeile 4: `sort -V (/var/sites/kamikathrin/app/data/quotes.ini)'
 
Hallo,

jetzt funktioniert es soweit, ich musste nur noch
Code:
-o
hinzufügen, damit er die Änderungen auch in die Datei schreibt.
 
Zurück
Oben