Wie kann ich unter Windows 7 einen Text nach Hashtags sortieren?
Ich habe einen langen Text (.txt-Format), der ungefähr so aussieht:
- Bla bla #Test
- 123123 #Wirklich
- Blabla #Wirklich
- klfdmngl #Test
Ich möchte den Text bequem, schnell und automatisch so sortieren können, dass er folgendermaßen aussieht:
- Bla bla #Test
- klfdmngl #Test
- 123123 #Wirklich
- Blabla #Wirklich
Ich muss dies täglich tun und würde es daher gerne mit so wenigen Schritten wie möglich erledigen können.
Antwort1
Hier ist eine Windows-Batchdatei (.bat) oder Befehlsdatei (.cmd), die das erledigt. Ich war mir nicht sicher, was Sie mit der Ausgabe machen wollten, also zeigt dies nur eine der beiden temporären Dateien an, die es erstellt, und löscht dann beide.
@echo off
if {%1} == {} (
echo usage: %0 ^<filename^>
goto :EOF
)
echo.>_temp1
for /F "tokens=1,2 delims=#" %%i in (%1) do echo %%j$%%i>>_temp1
echo.>_temp2
sort _temp1 >_temp2
echo.>_temp1
for /F "tokens=1,2 delims=$" %%i in (_temp2) do @echo %%j#%%i>>_temp1
type _temp1
del _temp1
del _temp2
Antwort2
Hier ist eine abschließende Powershell-Lösung, die mit neuen Zeilen umgeht. Als Trennzeichen wird ein Hashtag angenommen, gefolgt von Wortzeichen, gefolgt von {EOL}. Bei einer Datenzeile ohne Hashtag wird angenommen, dass die Daten in der nächsten Zeile fortgesetzt werden. Die anderen Informationen unter diesem Abschnitt meiner Antwort befassen sich nicht mit dem vom Autor erwähnten Sonderfall, bei dem Daten eine Zeilenumbruchgrenze überschreiten. In diesem Beispiel wird davon ausgegangen, dass die Datei den Namen „test.txt“ trägt und sich im aktuellen Verzeichnis befindet.
[string[]]$fileContent = (get-content .\test.txt);
[string]$linebuffer = '';
[object]$fixedFile = foreach($line in $fileContent) {
if(-not ($line -match "#\w+$")) {
$linebuffer += ($line + ' ');
continue;
}
$linebuffer += $line;
$linebuffer;
$linebuffer = '';
}
($fixedFile -replace '^(.*)\ (#.*)$', '$2 $1' | Sort-Object) -replace '^(#\w+)\ (.*)$','$2 $1' | out-file test.txt -encoding ascii
VerwendengVimunter Windows oderMacVimunter OS X.
NOTIZ:Vim ist ein Editor mit 2 Modi. Einfüge-/Bearbeitungsmodus und Befehlsmodus. Um Text wie in einem normalen Editor zu bearbeiten, müssen Sie sich im Bearbeitungsmodus befinden. Dazu müssen Sie eine Taste wie a
oder drücken i
. Der Editor wird im Befehlsmodus gestartet. Im Befehlsmodus können Sie diese Befehle einfach eingeben, indem Sie einen Doppelpunkt eingeben.
:%s/^\(.*\)\ \(\#\w\+\)$/\2\ \1/g
:sort
:%s/^\(\#\w\+\)\ \(.*\)$/\2\ \1/g
Der erste Befehl tauscht das Hashtag am Zeilenende an den Zeilenanfang. Der zweite Befehl sortiert die Daten und der dritte Befehl macht den Tausch rückgängig und verschiebt das Hashtag wieder ans Zeilenende.
Ich habe dies an Ihrem Muster getestet und es funktioniert.
@Oliver_Salzburg lieferte eineviel einfacherAntwort mit Excel in Kommentaren. Ich habe nicht über den Tellerrand hinausgeschaut und eine Antwort mit einem Texteditor bereitgestellt.
Schritt 1: Ersetzen
#
durch,#
Schritt 2: Als CSV in Excel oder eine ähnliche Anwendung importieren. –Oliver Salzburg♦
Hier ist eine Lösung, die nur Powershell verwendet und nativ unter Win7 ausgeführt werden kann. Ich hatte noch keine Gelegenheit, mich über das Durchlaufen von Zeilenumbrüchen zu informieren, daher werden diese in dieser Lösung nicht berücksichtigt.
In diesem Beispiel wird davon ausgegangen, dass die Datei, mit der Sie arbeiten, . ist test.txt
.
$tempstor = (get-content test.txt) -replace '^(.*)\ (#.*)$', '$2 $1' | Sort-Object
$tempstor -replace '^(#\w+)\ (.*)$','$2 $1' | out-file test.txt -encoding ASCII
Einzeiler, Unter-Shells nutzen.
((get-content test.txt) -replace '^(.*)\ (#\w+)$', '$2 $1' | Sort-Object) -replace '^(#\w+)\ (.*)$','$2 $1' | out-file test.txt -encoding ascii
Antwort3
Wenn Sie Windows verwenden, können Sie dieses einfache PowerShell-Skript verwenden:
[io.file]::ReadAllLines("test.txt")|Sort-Object {$_.SubString($_.IndexOf('#'))}
Ich bin alles andere als ein PowerShell-Experte, also entschuldigen Sie, wenn es eine bessere Lösung gibt :)
Beispiel
Hier ist der Inhalt meiner Eingabedatei test.txt
:
PS C:\Users\Oliver> type test.txt
Blah blah #Test
123123 #Really
Oliver #SuperUser
Blah bluh #Really
klfdmngl #Test
Dies ist die Ausgabe beim Ausführen des obigen Skripts:
PS C:\Users\Oliver> [io.file]::ReadAllLines("test.txt")|Sort-Object {$_.SubString($_.IndexOf('#'))}
Blah bluh #Really
123123 #Really
Oliver #SuperUser
klfdmngl #Test
Blah blah #Test
Analyse
[io.file] # From the module io.file...
::ReadAllLines # use method ReadAllLines to read all text lines into an array...
("test.txt") # from the file test.txt
| # Take that array and pipe it to...
Sort-Object # the cmdlet Sort-Object (to sort objects)
{ # To sort the elements in the array...
$_.SubString( # use the part of the text line...
$_.IndexOf('#') # that starts at the first position of a #
)}