Powershell: Zeilen kürzer als 12 länger als 20 aussortieren
Ich versuche gerade 2 große Text Datei zu verbinden, doppelte Zeilen zu löschen und alle Zeilen die kürzer als 12 und länger als 20 sind auszusortieren.
Ich habe folgendes schon raus gefunden:
Alle Text Dateien in dem Ordner Test werden zu einer Output.txt
Der Output wird hiermit auf doppelte einträge überprüft und in Output2 gespeichert
Hier dachte ich er entfernt alles länger als 20 aber er zählt nur irgend etwas:
Könnt ihr mir da helfen, ich bin ein Totaler anfänger was PowerShell betrifft.
Wenn man das alles auch noch in eine Zeile bekommen könnte mit einem Durchlauf wäre das Genial.
Danke,
Marcus
Ich habe folgendes schon raus gefunden:
Alle Text Dateien in dem Ordner Test werden zu einer Output.txt
Get-Content "D:\test\*.txt" -Force | Set-Content "D:\test\output.txt"
Der Output wird hiermit auf doppelte einträge überprüft und in Output2 gespeichert
Get-Content "D:\test\output.txt" -Force | Select-Object -Unique | Set-Content "D:\test\output2.txt"
Hier dachte ich er entfernt alles länger als 20 aber er zählt nur irgend etwas:
Select-String 'D:\test\output2.txt' -Pattern ".{20}" | select -Expand LineNumber
Könnt ihr mir da helfen, ich bin ein Totaler anfänger was PowerShell betrifft.
Wenn man das alles auch noch in eine Zeile bekommen könnte mit einem Durchlauf wäre das Genial.
Danke,
Marcus
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 7534038959
Url: https://administrator.de/forum/powershell-zeilen-kuerzer-als-12-laenger-als-20-aussortieren-7534038959.html
Ausgedruckt am: 25.03.2025 um 06:03 Uhr
12 Kommentare
Neuester Kommentar

Moin.
oder ohne Regex so
oder so geht's auch
Oder noch einer
Zeppel
Get-Content "D:\test\*.txt" | select -Unique | ?{$_ -match '^.{12,20}$'} | Set-Content "D:\output.txt"
Get-Content "D:\test\*.txt" | select -Unique | ?{$_.Length -ge 12 -and $_.Length -le 20} | Set-Content "D:\output.txt"
Get-Content "D:\test\*.txt" | select -Unique | ?{$_.Length -in (12..20)} | Set-Content "D:\output.txt"
Select-String -Path "D:\test\*.txt" -Pattern "^.{12,20}$" | Select -Unique -Expand Line | Set-Content "D:\output.txt"
Zeppel
Moin Marcus,
Get-Content ist hier überflüssig, man kann die Zeilen direkt mit Select-String filtern.
Gruß Thomas
Zitat von @marcusx:
Alle Text Dateien in dem Ordner Test werden zu einer Output.txt
hier ist ein kleiner Denkfehler drin: Wenn du das Skript mehrfach laufen lässt, würde "D:\test\*.txt" auch auf die Ausgabedatei "D:\test\output.txt" zutreffen.Alle Text Dateien in dem Ordner Test werden zu einer Output.txt
Get-Content "D:\test\*.txt" -Force | Set-Content "D:\test\output.txt"
Get-Content ist hier überflüssig, man kann die Zeilen direkt mit Select-String filtern.
Select-String -Pattern "^.{12,20}$" "C:\Pfad\zu\Textdatei1.txt","C:\Pfad\zu\Textdatei2.txt" | Select -Unique -ExpandProperty Line | Set-Content "C:\Pfad\zur\Outputdatei.txt"
Gruß Thomas

Zitat von @marcusx:
Welchen Wert müsste ich hinzufügen wenn ich das ganze jetzt noch nach Zufall oder A - Z Sortieren möchte?
Sort-Object dazwischen schaltenWelchen Wert müsste ich hinzufügen wenn ich das ganze jetzt noch nach Zufall oder A - Z Sortieren möchte?
Select-String -Path "D:\test\*.txt" -Pattern "^.{12,20}$" | Select -Unique -Expand Line | Sort-Object | Set-Content "D:\output.txt"
Und habt ihr eine Idee wie ich bei Dateien vorgehe die sehr groß sind und scheinbar auch nach 30 min noch nicht gespeichert sind, trotz sehr schneller festplatte?
Für wirklich große Files nutze ich stattdessen immer sed da hat Powershell von der Geschwindigkeit her keine Chance#!/bin/bash
sed -nre '/^.{12,20}$/p' /folder/*.txt | sort -u >output.txt

Wird per Default nach String Aufsteigend sortiert, für absteigend benutzt du den Parameter -Descending
Mehr siehe Doku
https://www.ionos.de/digitalguide/server/konfiguration/linux-sed-befehl/
https://gnuwin32.sourceforge.net/packages/sed.htm
Mehr siehe Doku
Hast du für sed mehr infos für mich?
https://www.geeksforgeeks.org/sed-command-in-linux-unix-with-examples/https://www.ionos.de/digitalguide/server/konfiguration/linux-sed-befehl/
https://gnuwin32.sourceforge.net/packages/sed.htm

Zitat von @marcusx:
Zufall ist also so richtig?
Das ist nicht Zufall, es kommt so raus wie es aus den Dateien kommtZufall ist also so richtig?
Select-String -Path "D:\test\*.txt" -Pattern "^.{12,20}$" | Select -Unique -Expand Line | Sort-Object -Unique | Set-Content "D:\output.txt"
Z-A:
So ist es nach String absteigend (Z-A).Select-String -Path "D:\test\*.txt" -Pattern "^.{12,20}$" | Select -Unique -Expand Line | Sort-Object -Descending | Set-Content "D:\output.txt"
RTFM!! da steht's doch?!

Zufall/Random kannst du mit bspw. mit Get-Random machen
Select-String -Path "D:\test\*.txt" -Pattern "^.{12,20}$" | Select -Unique -Expand Line | get-random -Count ([Int32]::MaxValue) | Set-Content "D:\output.txt"

Schnapp dir doch einfach das oben verlinkte sed für windows oder aktiviere das in Windows bereits integrierte WSL
https://learn.microsoft.com/en-us/windows/wsl/install
Feddisch, braucht es keine VM für ...
https://learn.microsoft.com/en-us/windows/wsl/install
Feddisch, braucht es keine VM für ...