Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Textdateien inhaltlich vergleichen

Frage Entwicklung Batch & Shell

Mitglied: ghoyer

ghoyer (Level 1) - Jetzt verbinden

12.03.2009, aktualisiert 09:12 Uhr, 2479 Aufrufe, 2 Kommentare

Tach zusammen,

Folgendes Problem:
Ich habe zwei Dateien eines Rechenlaufes, von welchen eine die Werte aller Rechenzeitschritte enthält, die andere nur die Maximalwerte. Die Dateien sehen dabei wie folgt aus:

Die Datei mit den Einzelwerten (WSPL.dat):
01.
SCALAR 
02.
ND  21516 
03.
ST  0 
04.
TS        10.00 
05.
    0.0000 
06.
    0.0000 
07.
    0.0000 
08.
    0.0000 
09.
    0.0000 
10.
    0.0000 
11.
... 
12.
SCALAR 
13.
ND  21516 
14.
ST  0 
15.
TS     14400.41 
16.
    0.0000 
17.
  115.8919 
18.
  115.8919 
19.
  115.8900 
20.
  115.8861 
21.
  115.8864 
22.
... 
23.
SCALAR 
24.
ND  21516 
25.
ST  0 
26.
TS     28800.33 
27.
    0.0000 
28.
  116.2450 
29.
  116.2450 
30.
  116.2397 
31.
  116.2361 
32.
  116.2369 
33.
... 
34.
usw.
"ND" steht dabei für die Anzahl der Rechennetzknoten (Nodes) und damit die Anzahl der Zeilen je Zeitschritt,
"TS" für den aktuellen Zeitschritt (Time Step) in Sekunden. Die Nachkommastellen bei der Zeit sind für mich uninteressant.
Ein "End-Tag" je Zeitschritt ist nicht vorhanden.

Die Datei mit den Maximalwerten (WSPL_max.dat):
01.
SCALAR 
02.
ND  21516 
03.
ST  0 
04.
TS     43200.19 
05.
    0.0000 
06.
  116.4927 
07.
  116.4927 
08.
  116.4711 
09.
  116.4741 
10.
  116.4742 
11.
...
Hier ist "TS" der letzte gerechnete Zeitschritt.

Ich möchte nun eine Datei, in der der Zeitschritt steht, in dem das Maximum erreicht wird. z.B. so (Diese ist jetzt nur gebastelt!):
01.
SCALAR 
02.
ND  21516 
03.
ST  0 
04.
TS     43200.19 
05.
    0.0000 
06.
  3600 
07.
  7200 
08.
  14400 
09.
  28800 
10.
  7200 
11.
...

Zum Thema Robustheit / Datenvolumen:
Die vorherigen Daten stammen aus einem überschaubaren Rechennetz. Die Anzahl der Knoten (ND) liegt z.Z. um die 1,2 Mio. bei 50 Zeitschritten und mehr. Das macht ca 13 MB für die WSPL_max.dat und z.B. 640 MB für die WLSP.dat. Für diese Groß-Projekte darf die Aufbereitung auch ein paar Stündchen dauern.

Meine Idee wäre, die WSPL.dat in einzelne Datei-"Scheibchen" je Zeitschritt zu teilen (z.B. per FOR-Schleife) und dann z.B. per FC die Scheibchen mit der Maximaldatei zu vergleichen. Irgendwo hatte ich hier im Forum auch schon ein VB-Script für Berechnungen mit Nachkommastelle gefunden.

Bevor ich jetzt drauf los klimpere und einen Haufen Zeit wegen unausgereifter Batch- / VB-Kenntnisse vertrödle, wollte ich Euch um Kommentierung bzw. Alternativvorschläge bitten.

Danke, Gisi
Mitglied: Biber
13.03.2009 um 18:56 Uhr
Moin ghoyer,

ich würde eine etwas Strategie vorschlagen...
Dein Lösungsansatz würde ja auch zum Ziel führen, hat aber irgendwie den immer deprimierend wirkenden Anstrich von stundenlangem stupiden Sandschaufeln.
So was schlägt mir immer aufs Gemüt.

Wenn ich die Anforderung richtig verstanden habe, dann willst Du doch nur den Max-Wert der Zeilen "TS nnnnn.mm" ermitteln und genau diesen vollständigen Block rausziehen.

Also wäre meine Idee
  • den Max-Wert (neudeutsch maxvalue, im folgenden als Variable %mv% auftauchend) der "TimeStep"-Zeilen ermitteln
  • von dieser Zeile mit dem maxWert merken wir uns die Zeilen-Nummer (nenn ich mal %mvl% wie maxValueLine.
  • und holen uns aus dem ganzen Riesen-Textgeraffel der wspl.dat diese Zeile+ein paar Zeilen plusminus aus.

Schritt 1 & 2 lassen sich mit einer CMD-Promptzeile abfackeln, wie ich an einer um 2 Blöcke erweiterten wspl.dat demonstrieren möchte:
01.
SCALAR 
02.
ND  21516 
03.
ST  0 
04.
TS        10.00 
05.
    0.0000 
06.
    0.0000 
07.
    0.0000 
08.
    0.0000 
09.
    0.0000 
10.
    0.0000 
11.
... 
12.
SCALAR 
13.
ND  21516 
14.
ST  0 
15.
TS     14400.41 
16.
    0.0000 
17.
  115.8919 
18.
  115.8919 
19.
  115.8900 
20.
  115.8861 
21.
  115.8864 
22.
... 
23.
SCALAR 
24.
ND  21516 
25.
ST  0 
26.
TS     28800.33 
27.
    0.0000 
28.
  116.2450 
29.
  116.2450 
30.
  116.2397 
31.
  116.2361 
32.
  116.2369 
33.
SCALAR 
34.
ND  12345 
35.
ST  0 
36.
TS        10.00 
37.
    0.0000 
38.
    0.0000 
39.
    0.0000 
40.
    0.0000 
41.
    0.0000 
42.
    0.0000 
43.
... 
44.
SCALAR 
45.
ND  23456 
46.
ST  0 
47.
TS     14400.41 
48.
    0.0000 
49.
  115.8919 
50.
  115.8919 
51.
  115.8900 
52.
  115.8861 
53.
  115.8864
Darauf schiesse ich diese Zeile ab vom CMD-Prompt:
[ohne ">".... das ">" ist mein Prompt-Zeichen.... NICHT mit eingeben!]
01.
>set "mv=0" & for /f "tokens=1-3 delims=:. " %i in ('findstr /n "^TS" wspl.dat') do @if %k GTR !mv! @(set "mv=%k" && set "ml=%i" & @echo mv=%k; !ml!)
... und erhalte (as should do) folgende Ausgabe:
01.
mv=10; 4 
02.
mv=14400; 15 
03.
mv=28800; 26
---> d.h. mit dieser einen Zeile habe ich den TS-maxWert 28000 ermittelt und weiss, dass der in Zeile 26 Steht

Wenn ich dann noch "weiss", dass zwei Zeilen davor der NodeName steht und in den 5 Zeilen danach die Detailwerte, dann kann ich diese Zeilen gezielt herausfieseln.
01.
>findstr /n $ wspl.dat|findstr "^24: ^26: ^27: ^28: ^29: ^30: ^31: ^32" 
02.
24:ND  21516 
03.
26:TS     28800.33 
04.
27:    0.0000 
05.
28:  116.2450 
06.
29:  116.2450 
07.
30:  116.2397 
08.
31:  116.2361 
09.
32:  116.2369
Nun muss ich nur noch die Zeilen-Nummern wieder entsorgen:
01.
>for /f "delims=: tokens=2" %i in ('findstr /n $ wspl.dat^|findstr "^24: ^26: ^27: ^28: ^29: ^30: ^31: ^32"') do @echo %i 
02.
ND  21516 
03.
TS     28800.33 
04.
    0.0000 
05.
  116.2450 
06.
  116.2450 
07.
  116.2397 
08.
  116.2361 
09.
  116.2369
Dann habe ich den Block, den Du wolltest.

Oder habe ich es falsch verstanden?

Grüße
Biber
Bitte warten ..
Mitglied: ghoyer
15.03.2009 um 16:30 Uhr
Hallo, Batch-Großmeister,

Ich sehe, ich muss meine Ausdrucksweise verbessern.

Hatte ich schon erwähnt, das "ND" die ANZAHL der Knoten ist? Diese ist immer gleich.
Die TS-Werte sind von einer "Scheibe" zur nächsten aufsteigend (z.B. wird aller 2 h = 7200 s ein Daten-"Scheibchen" ausgeschrieben, d.h. an die WSPL.dat angehängt.).
Ansonsten sind die Kopfzeilen mehr oder weniger Schall und Rauch.

Die individuelle Knotennummer ist nicht in der Datei enthalten, die Zeilennummer in jedem Daten-"Scheibchen" entspricht hier der Knotennummer (abzüglich der paar Kopfzeilen)

Ich möchte im Ergebnis also einen einfaches Daten-"Scheibchen", in dem für jeden einzelnen Knoten steht, in welchem Zeitschitt (also WANN, der TS-Wert am Beginn jedes "Scheibchens") an diesem das für jeden Knoten individuelle Maximum erreicht wird. Das ist aufgrund von Wellenausbreitungen durchaus in unterschiedlichen Zeitschritten möglich.
Der individuelle Maximalwert steht ja schon in der WSPL_max.dat.

Ich hoffe, ich konnte alle Klarheiten beseitigen

Danke, Gisi
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Batch & Shell
gelöst Textdateien vergleichen BATCH (2)

Frage von FeudelFred zum Thema Batch & Shell ...

Windows Server
AD-Berechtigungen von zwei Servern miteinander vergleichen (3)

Frage von s0m3ting zum Thema Windows Server ...

Batch & Shell
gelöst Powershell - Dateien aus verschiedenen Arrays - Attribute vergleichen (5)

Frage von Giffas zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (20)

Frage von Xaero1982 zum Thema Microsoft ...

Outlook & Mail
gelöst Outlook 2010 findet ost datei nicht (19)

Frage von Floh21 zum Thema Outlook & Mail ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Festplatten, SSD, Raid
M.2 SSD wird nicht erkannt (14)

Frage von uridium69 zum Thema Festplatten, SSD, Raid ...