[gelöst] Textdatei partiell sortieren

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
armin
Beiträge: 2682
Registriert: 17.03.2005 11:49:14

[gelöst] Textdatei partiell sortieren

Beitrag von armin » 03.08.2007 12:56:47

Das Topic ist vielleicht etwas bescheuert, was ich will ist aber eigentlich ganz einfach.
Man stelle sich vor, man hätte Dateien, die etwa so aussehen:

Code: Alles auswählen

SET(behaviorGui_SRCS
../../../robocup/src/behavior/dialog/xabslinfo2/IXabslDialog.cpp
../../../robocup/src/behavior/dialog/xabslinfo2/XabslInfoWidget.cpp
../../../robocup/src/behavior/dialog/xabslinfo2/XabslInfoItemModel.cpp
)

SET(behaviorGui_MOC_HDRS
../../../robocup/src/behavior/dialog/xabslinfo2/XabslInfoWidget.h
../../../robocup/src/behavior/dialog/xabslinfo2/IXabslDialog.h
../../../robocup/src/behavior/dialog/xabslinfo2/XabslInfoItemModel.h
)

QT4_WRAP_CPP(behaviorGui_MOC_SRCS ${behaviorGui_MOC_HDRS})

add_library(behaviorGui ${behaviorGui_SRCS} ${behaviorGui_MOC_SRCS})
target_link_libraries(behaviorGui robogui behaviorApp)
Das Ziel ist jetzt, die Pfade in den SET-Ausdrücken alphabetisch zu sortieren. Diese können übrigens in beliebiger Anzahl auftreten.
Ich denke mit den entsprechenden Skripting-Kentnissen ist das alles kein Problem, ich tue mir aber gerade etwas schwer. Eigentlich müsste man ja nur den Anfang eines SET-Ausdrucks finden, alles bis zur nächsten Klammer extrahieren und durch sort jagen.

Hat jemand einen Tip?
Zuletzt geändert von armin am 04.08.2007 13:54:21, insgesamt 1-mal geändert.
Formerly known as Trigger.
HP 8510p - Debian Sid
Mitglied des Debian-KDE-Teams

roli
Beiträge: 3174
Registriert: 10.09.2003 17:39:58

Beitrag von roli » 03.08.2007 13:18:36

Hi,

ich wuerde die Datei einlesen. Alles was bis zum ersten SET (incl.) kommt kannst du direkt wieder rausschreiben. Jetzt werden die naechsten Zeilen eingelesen bis die zum SET gehoerige passende schliessende Klammer kommt. Diese Zeilen die du bis jetzt irgendwo gepuffert hast, sortierst du und schreibst sie + die schliessende Klammer raus. Anschliessend liesst du weiter (und schreibst auch gleich den Output) bis zum naechsten SET.
Und wenn sie nicht gestorben sind lesen/schreiben sie noch heute ...
Roland


"Aber wenn du schon so unwissend bist, davon noch nicht gehört zu haben,
so will ich es doch als gut ansehen, daß du lieber einmal töricht fragst,
als weiterhin nichts von etwas zu wissen, das man doch wissen sollte."
aus "Die Edda des Snorri Sturluson", "Gylfis Täuschung"

Benutzeravatar
armin
Beiträge: 2682
Registriert: 17.03.2005 11:49:14

Beitrag von armin » 03.08.2007 15:07:31

Das ist mir soweit schon klar, die frage ist nur, wie ich so etwas am besten mit Bash und Freunden angehe.
Formerly known as Trigger.
HP 8510p - Debian Sid
Mitglied des Debian-KDE-Teams

Benutzeravatar
armin
Beiträge: 2682
Registriert: 17.03.2005 11:49:14

Beitrag von armin » 04.08.2007 13:55:42

Sodele, hab mich mal ein wenig in Awk eingelesen. Ist wie ich gemerkt habe je eigentlich genau das was ich brauche.
Mein erster Versuch scheint sogar schon zu funktionieren. Zumindest solange die Datei nach meinen Wünschen formatiert ist ;)

Code: Alles auswählen

BEGIN { IGNORECASE=1; }

/SET.*[^)]$/ {
  print $0;
  setFound = 1;
  count = 0;
  next;
}

/\)/ && setFound {
  setFound = 0;
  asort(fileNames);
  for (i = 1; i <= count; i++) {
    print fileNames[i];
  }
  print $0;
  next;
}

{
  if (setFound) {
    count++;
    fileNames[count]=$0;
  } else {
    print $0;
  }
}
Formerly known as Trigger.
HP 8510p - Debian Sid
Mitglied des Debian-KDE-Teams

Antworten