Windows CLI: Textdatei nach Spalte sortieren

635
masher

Ich möchte eine Textdatei mit Hilfe der reinen Windows-CLI-Befehle nach der dritten Spalte der Daten und nicht nach dem dritten Zeichen sortieren. Die Befehle würden in einer Batchdatei abgelegt.

Die Daten würden ungefähr so ​​aussehen

#filename seqno phasename a b c scale Rwp blah_001.xye 1 corundum 3 3 12 0.001 3 blah_001.xye 1 silicon 5.4 5.4 5.4 0.002 3 blah_002.xye 2 corundum 3.1 3.1 12.1 0.002 3.5 blah_002.xye 2 silicon 5.41 5.41 5.41 0.004 3.5 blah_003.xye 3 corundum 3.2 3.2 12.2 0.001 3.1 blah_003.xye 3 silicon 5.42 5.42 5.42 0.002 3.1 blah_004.xye 4 corundum 3.4 3.4 12.2 0.001 3.2 blah_004.xye 4 silicon 5.43 5.43 5.43 0.002 3.2 blah_005.xye 5 corundum 3.5 3.5 12.3 0.001 3.9 blah_005.xye 5 silicon 5.44 5.44 5.44 0.002 3.9 blah_006.xye 6 corundum 3.6 3.6 12.3 0.001 3.1 blah_006.xye 6 silicon 5.45 5.45 5.45 0.002 3.1 

Ich möchte nach Phasennamen sortieren. Wenn es gut wäre, wenn ich die erste Reihe halten könnte. Es gibt mehr als 5 Spalten nach der dritten und es werden mehr Zeilen als diese vorhanden sein, aber die Sortierung würde immer nach der dritten Spalte erfolgen.

Ich habe diese Frage gesehen, aber ich kann die for-Befehle nicht entschlüsseln.

0
Ich empfehle Ihrer Aufmerksamkeit [die umfangreichen Informationen zu SS64 zum Befehl "FOR"] (https://ss64.com/nt/for.html) oder die [eigene Dokumentation von Microsoft zum Befehl "FOR"] (https: / /docs.microsoft.com/en-us/windows-server/administration/windows-commands/for) oder sogar die Ausgabe von "HELP FOR". Jeff Zeitlin vor 6 Jahren 0

1 Antwort auf die Frage

0
dbenham

Ihre Datei verwendet ein Format mit fester Breite, sodass Sie immer an Position 21 mit dem Sortieren beginnen möchten.

Der SORTBefehl bietet eine Option, um jeden Zeilenvergleich an einer bestimmten Position in der Zeile durchzuführen. Das einzige Manko ist, dass es keinen Mechanismus gibt, um den Header-Datensatz an der Spitze zu halten.

Der Trick besteht also darin SET /P, die erste Zeile zu lesen und in eine neue Datei zu schreiben. Dann MORE +1lesen Sie alle bis auf die 1. Zeile SORT \+21und leiten diese an die neue Datei. Als letztes müssen Sie die Originaldatei mit der neuen Datei mit überschreiben MOVE.

@echo off setlocal enableDelayedExpansion set "file=test.txt" set /p "ln=" < "%file%" >"%file%.new" ( echo(!ln! more +1 "%file%" | sort /+21 ) move /y "%file%.new" "%file%" >nul 

Diese Strategie unterliegt Einschränkungen:

  • MORE wird hängen, wenn die Datei Zeilen mit mehr als 64 KB überschreitet
  • MORE konvertiert Tabulatoren in Leerzeichen
  • Die Kopfzeile darf aufgrund von SET / P-Einschränkungen nicht länger als 1021 Zeichen sein.

Alternativ können Sie mein JSORT.BAT-Dienstprogramm verwenden, um die Sortierung mit einem einfachen Befehl einfach und effizient auszuführen. Der MOVE ist noch erforderlich.

@echo off call test.txt /p 21 /s 1 /o test.txt.new move /y test.txt.new test.txt >nul 

JSORT ist ein reines Skript (Hybrid-JScript / Batch), das nativ auf jedem Windows-Computer ab XP ausgeführt wird. Es wird keine Drittanbieter-Exe-Datei benötigt.

Beachten Sie, dass JSORT im Gegensatz zu dem integrierten Befehl SORT standardmäßig eine Groß- und Kleinschreibung verwendet. Kein Problem mit Ihrem Beispieltext, aber wenn Sie Groß- und Kleinschreibung ignorieren möchten, fügen Sie die /IOption einfach an .

JSORT hat eine Größenbeschränkung aufgrund der Tatsache, dass die gesamte Datei in eine einzige Zeichenfolgenvariable im Speicher passen muss. Ich bin nicht sicher über den genauen Wert, aber ich glaube, dass die maximal unterstützte Dateigröße etwas weniger als 1 GB beträgt.

Lesen Sie die integrierte Hilfe, um weitere nützliche Funktionen kennenzulernen, die JSORT unterstützt.

  • Eingebettete Zahlen als Zahlen statt Text sortieren
  • Sortiert nach einem begrenzten Token anstelle einer festen Position
  • Erhalten Sie nur eindeutige Zeilen
  • Begrenzen Sie die Anzahl der Ausgabezeilen