instinctless
Goto Top

Spezifische Zeilen aus Textdatei entfernen

Hallo Community, ich benötige eure Hilfe.
Ich habe eine Textdatei die so aufgebaut ist
E5      228346       NCF2_rs2274064  UNKNOWN 0.12126
E6
E7      227922       ATP13A4_rs6788448       UNKNOWN

Es gibt also am Zeilenanfang einen Bezeichner A1 - Z99.
Wie oben zu sehen gibt es aber auch Zeilen wo nur der Bezeichner vorhanden ist (E6), dahinter aber keine Daten stehen.
Wie bekomme ich es hin, dass genau jene Zeilen aus der Datei entfernt werden?

Content-ID: 2811012095

Url: https://administrator.de/contentid/2811012095

Ausgedruckt am: 24.11.2024 um 18:11 Uhr

TK1987
TK1987 17.05.2022 um 12:20:29 Uhr
Goto Top
Moin,

mit Powershell und ein bisschen Regex ein Kinderspiel:
(Get-Content "C:\Pfad\zur\Datei.txt") -NotMatch "^[A-Z]\d{1,2}$" | Set-Content "C:\Pfad\zur\Output.txt"  

Powershell Leitfaden für Anfänger
Regex Tutorial

Gruß Thomas
colinardo
Lösung colinardo 17.05.2022 aktualisiert um 12:23:40 Uhr
Goto Top
Servus.
Da das hier in der Kategorie Linux gepostet wurde gehe ich mal von bash/sh aus (auch wenn Powershell unter Linux natürlich auch funktioniert Thomas aber eben nicht out of the box face-smile)
grep -Ev '^[A-Z][0-9]{1,2}\s*$' test.txt >datei_neu.txt  
Grüße Uwe
TK1987
TK1987 17.05.2022 aktualisiert um 12:29:49 Uhr
Goto Top
Moin Uwe,

Zitat von @colinardo:
Da das hier in der Kategorie Linux gepostet wurde gehe ich mal von bash/sh aus
Stimmt, hab ich glatt übersehen (im Ticker stehen leider die Tags nicht mit dabei).

Gruß Thomas
instinctless
instinctless 17.05.2022 aktualisiert um 13:08:38 Uhr
Goto Top
Ganz hervorragend.
Ich bin noch nicht so der Regex Spezi.
Kannst du mir vllt noch erklären, was
\s*$'   
macht?
$ steht ja für "bis zum Ende"
beim \s* spekuliere ich auf, hau alles weg bis $.
Ist das korrekt?
TK1987
TK1987 17.05.2022 aktualisiert um 13:20:24 Uhr
Goto Top
Moin,

\s beinhaltet Leerzeichen, Tabs, Zeilenümbrüche und Carriage Returns
* ist eine Mengenangabe und bedeutet 0 oder mehr (bis es nicht mehr zutrifft).

Mit anderen Worten, wenn hinter der gesuchten Zeichenkette nur noch Leerzeichen oder ähnliches folgen, wird die Zeile auch ausgelassen.

Gruß Thomas
colinardo
colinardo 17.05.2022 aktualisiert um 14:37:42 Uhr
Goto Top
\s* = Von mir gerne "Spacemonkey" genannt face-smile. Habe ich mir hier im Forum angewöhnt da es hier immer wieder mal Kandidaten gibt die Ihre Logs mit Batch schreiben und da dann am Ende unwissend Spaces in die Zeilen echo'n.
TK1987
TK1987 17.05.2022 um 14:54:29 Uhr
Goto Top
Zitat von @colinardo:
\s* = Von mir gerne "Spacemonkey" genannt face-smile. Habe ich mir hier im Forum angewöhnt da es hier immer wieder mal Kandidaten gibt die Ihre Logs mit Batch schreiben und da dann am Ende unwissend Spaces in die Zeilen echo'n.
Je nachdem, welches Programm man verwendet (oder mit welchen Parameter), muss man damit allerdings vorsichtig sein.
Ich bin damit z.B. bei Notepad++ schon ein paar mal auf die Nase gefallen, bei "\s*$" sind dann nämlich die Zeilenumbrüche mit futsch 😉

grep und sed verabeiten die Daten Zeilenweise, solange man den Parameter -z nicht angibt, daher geht das hier natürlich. Andernfalls müsste man sonst etwa "[ \t]*" verwenden, um nur Leerzeichen und Tabs zu berücksichtigen.

Gruß Thomas
colinardo
colinardo 17.05.2022 aktualisiert um 15:01:12 Uhr
Goto Top
Jepp, Regex nimmt einem wie üblich auch je nach Engine jede Kleinigkeit übel also immer schön die Flags beachten. Deswegen "Affe" der springt auch mal gerne wenn man ihn lässt face-wink.