Forum: PC Hard- und Software immer gleiche Zeilen in txt löschen - Schnellmodus?


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von ● Des I. (Firma: FULL PALATINSK) (desinfector) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Ich habe eine laaange Textdatei, Playlist von einer Webseite.

dort sind 2 verschiedene immer wiederkehrende Zeilen und der Text 
dazwischen kann gelöscht werden. Das würde die Datei erheblich kürzen.

hier mal ein Ausschnitt:
1
STILTSKIN - INSIDE
2
06:11
3
STILTSKIN
4
INSIDE
5
iTunes
6
Reamonn - Aeroplane
7
06:06
8
Reamonn
9
Aeroplane
10
iTunes
11
Mötley Crüe - Wild Side
12
06:02
13
Mötley Crüe
14
Wild Side
15
iTunes
16
The Killers - Read My Mind
17
05:53
18
The Killers
19
Read My Mind
20
iTunes
21
Eagles - Hotel California
22
05:47
23
Eagles
24
Hotel California
25
iTunes
26
Jimmy Eat World - The Middle
27
05:44
28
Jimmy Eat World
29
The Middle
30
iTunes

da Band und Titel immer 2 mal vorhanden sind und ich auch die Zeitangabe 
sowie das Wort "itunes" da drin nicht brauche,
Suche ich einen Kniff, um alles Zwischen Zeitangabe und "itunes" zu 
löschen. incl. der genannten Zeilen. Sodass da am Ende nur die Zeilen

"Bandname - Titel"

übrig bleiben.

Man muss also z.B. per Kommandozeile oder Prog also nach Doppelpunkt und 
dem Wort "itunes" suchen und alles da drin liegende löschen.
Nur was kann man da nutzen?

Betriebssysteme Win oder Ubuntu.

von Kommandozeile vor dem Frühstück für Alle! (Gast)


Bewertung
0 lesenswert
nicht lesenswert
> "Bandname - Titel"
>
> übrig bleiben
1
$ grep ' - ' laaangedatei > kurzedatei

Sofern ' - ' NICHT auch in einem Songtitel oder Bandname auftaucht...


Da Win nicht das standard Werkzeug grep hat, muss die Anleitung des 
Befehls "find" gelesen werden.

von Rufus Τ. F. (rufus) (Moderator) Benutzerseite


Bewertung
2 lesenswert
nicht lesenswert
Kommandozeile vor dem Frühstück für Alle! schrieb:
> Da Win nicht das standard Werkzeug grep hat, muss die Anleitung des
> Befehls "find" gelesen werden.

Windows bietet für derartige Verrenkungen das leistungsfähigere 
findstr.

Alternativ kann man sich natürlich auch einen Win32-Port von grep 
installieren, dazu kann man sich entweder den Linux-Emulator "cygwin" 
auf den Rechner packen, oder --sofern das Windows neu genug ist-- die 
aktuelle Variante der "Unix Services for Windows" installieren, oder 
minimalistisch nur das hier:

http://gnuwin32.sourceforge.net/packages/grep.htm

von Amateur (Gast)


Bewertung
2 lesenswert
nicht lesenswert
Für solch einfache Sachen lade ich die Datei ins Notepad++.

Da gibt es einen sehr einfach zu bedienenden Makrorekorder.

Einmal von Hand löschen dann einfach wiederholen...

von ● Des I. (Firma: FULL PALATINSK) (desinfector) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Amateur schrieb:
> Einmal von Hand löschen dann einfach wiederholen...

obwohl zwischen den genannten Zeilen immer verschiedener Text steht?
Auch kann mit der Zeit die Anzahl der Zeilen dazwischen variieren.

von c.m. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
1
sed -n '1~5p' < datei.txt 
2
STILTSKIN - INSIDE
3
Reamonn - Aeroplane
4
Mötley Crüe - Wild Side
5
The Killers - Read My Mind
6
Eagles - Hotel California
7
Jimmy Eat World - The Middle

mit sed jede Nte zeile ausgeben lassen. datei.txt enthält hier den vom 
OP geposteten text.

von Daniel F. (df311)


Bewertung
0 lesenswert
nicht lesenswert
geht auch in notepad++:
regex sind dein freund ;-)

von Krypton (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
Wie wärs mit Python?
Die Stuktur ist ja immer gleich, also einfach durch die Zeilen durch 
iterieren, mitzählen und je nachdem Zeile löschen oder nicht löschen.

von W.S. (Gast)


Bewertung
-5 lesenswert
nicht lesenswert
Siehste, sowas macht unsereiner mit Delphi:

Eine simple Kommandozeilen-App schreiben, die im Text nach Zeilen sucht, 
welche eine Uhrzeit-Angabe enthalten, als nummer:nummer und nix weiters. 
Dann die jeweils DAVOR liegende Zeile in die Ausgabedatei schreiben.

Ich vermute mal, daß man sowas mit grep und Konsorten nicht wirklich 
hinkriegt. Aber in Pascal geschrieben ist das nur ein recht kurzer 
Quelltext.

W.S.

von Amateur (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Wenn es keine Anhaltspunkte dafür gibt, was gelöscht werden soll, geht 
das Ganze nur mit der neuen Software von Hellseher.

Deine Liste habe ich folgendermaßen bereinigt:
Start Makroaufzeichnung
Ctrl F
:
"Such-Fenster schließen"
Home
Schift-Taste halten
4 X Cursor Down
Schift-Taste loslassen
Entfernen
Ende Makroaufzeichnung

Nach Bedarf wiederholen.

Natürlich ist das Ganze für ‘n Ars**, wenn Du jetzt sagst, dass Du aus 
einer völlig anderen Liste Deine Kenndaten extrahieren willst.

Aber wie bereits gesagt: Deine ganz speziellen Wünsche kann nur eine 
hellseherische Software voraussehen.

Übrigens: Alle Zeiten könnten durch die Suche nach dem Doppelpunkt 
gefunden werden. Falls nicht irgendeine Combo auf die Idee gekommen ist 
ihn in ihrem Bandnamen zu verwenden.
Fixe Namen können durch die Suche danach erreicht werden.
Die zweite Wiederholung kann, da nicht schematisierbar z.B. durch die 
Suche nach der Zeit und dem Löschen der folgenden zwei Zeilen getilgt 
werden. Hier gilt aber: Es gibt Kuddel-Muddel, wenn diese dann nicht 
folgen. Hier gilt dann aber was ich zum Thema: Ganz andere Liste gesagt 
habe.

von asdfghjkll (Gast)


Bewertung
0 lesenswert
nicht lesenswert
W.S. schrieb:
> Siehste, sowas macht unsereiner mit Delphi:
>
> Eine simple Kommandozeilen-App schreiben, die im Text nach Zeilen sucht,
> welche eine Uhrzeit-Angabe enthalten, als nummer:nummer und nix weiters.
> Dann die jeweils DAVOR liegende Zeile in die Ausgabedatei schreiben.
>
> Ich vermute mal, daß man sowas mit grep und Konsorten nicht wirklich
> hinkriegt. Aber in Pascal geschrieben ist das nur ein recht kurzer
> Quelltext.
>
> W.S.

z.B.

Aber so etwas ist genau das, wofuer PERL erfunden wurde.
Wie so oft, viele Wege sind moeglich.

asdfghjkll

von Amateur (Gast)


Bewertung
2 lesenswert
nicht lesenswert
Delphi    zu teuer
Pearl    muss man können
NotePad++  einfach klicky-bunty
:-)

von E. T. (jadeaffenjaeger)


Bewertung
-1 lesenswert
nicht lesenswert
In Vim:

qaj4ddq
:normal @a

(nicht getestet, sollte aber klappen)

von c.m. (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
E. T. schrieb:
> In Vim:
>
> qaj4ddq
> :normal @a
>
> (nicht getestet, sollte aber klappen)

war das nicht iddqd? ^^

von Yalu X. (yalu) (Moderator)


Bewertung
0 lesenswert
nicht lesenswert
c.m. schrieb:
> sed -n '1~5p' < datei.txt

Oder gleich in-place mit
1
sed -i '1~5!d' datei.txt

bzw.
1
sed -i.orig '1~5!d' datei.txt

wenn man zur Sicherheit eine Kopie des Originals in datei.txt.orig
beibehalten möchte.

von E. T. (jadeaffenjaeger)


Bewertung
0 lesenswert
nicht lesenswert
:)

Erklaerung:
qa - Makro mit dem Namen "a" aufzeichnen
j - Eine Zeile nach unten gehen
4dd - Entferne 4 Zeilen
q - Makro beenden

:normal @a - Makro "a" bis zum Ende der Datei wiederholen

von Rufus Τ. F. (rufus) (Moderator) Benutzerseite


Bewertung
1 lesenswert
nicht lesenswert
W.S. schrieb:
> Ich vermute mal, daß man sowas mit grep und Konsorten nicht wirklich
> hinkriegt. Aber in Pascal geschrieben ist das nur ein recht kurzer
> Quelltext.

Auch mit grep & co. ist das kein Problem, wenn man mit regulären 
Ausdrücken ("regex") umgehen kann. Die sind für derartige Aufgaben 
erfunden worden. Sehen zwar aus, als hätte eine Katze auf die Tastatur 
gekotzt, sind aber wirklich sehr, sehr mächtig.

von Yalu X. (yalu) (Moderator)


Bewertung
0 lesenswert
nicht lesenswert
Bei grep besteht das schon von "Kommandozeile vor dem Frühstück für
Alle!" angemerkte Problem, das sich die "guten" von den "schlechten"
Zeilen nicht immer durch ihren Inhalt unterscheiden lassen.

Wenn ich das Problem aber richtig verstanden habe, sind die guten Zeilen
anhand ihrer Position in der Datei festgelegt (Zeile 1, 6, 11, 16 ...).
Für solche Dinge eignen sich sed und awk sehr gut.

Die sed-Lösung wurde schon von c.m. geliefert. Hier dasselbe mit awk:

1
awk 'NR%5==1' datei.txt

W.S. schrieb:
> Aber in Pascal geschrieben ist das nur ein recht kurzer Quelltext.

Ja, oder in Fortran ;-)

von ● Des I. (Firma: FULL PALATINSK) (desinfector) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
also meine Vorstellung ist die, dass ich alles,
was zwischen dem Zeichen ":" und dem Wort "iTunes" liegt löschen möchte.

Es müsste also eben dieses "markiert" werden
und alles, was dazwischen liegt, soll gelöscht werden.
Incl der Zeilen, in denen diese "Markierungen" sitzen

jetzt stelle man sich mal eine hunderte Seiten lange Liste vor,
in der Namen so lang sind, dass es Zeilenumbrüche gibt,
dass man immer mal wieder mehrere Leerzeilen dazwischen hat,
in der nicht immer 4 Zeilen dazwischen liegen (auch mal 3 oder 5) 
uswusf.

eben eine Liste die innerhalb einiger Monate zusammen kopiert worden 
ist.

sowas wie "jede n-te Zeile löschen" läuft dann schnell verkehrt.

es müsste im Grunde "nur" eine Editier-Funktion
wie im Programm "Ant-Renamer" für Dateinamen auch für Texte geben.
sowas in der Art suche ich.
Ich denke das könnte mir schon gut helfen.

von Rolf Magnus (Gast)


Bewertung
0 lesenswert
nicht lesenswert
J-A VdH hat doch schon geschrieben, wie er/sie/es sich das vorstellt:

> Suche ich einen Kniff, um alles Zwischen Zeitangabe und "itunes" zu
> löschen. incl. der genannten Zeilen. Sodass da am Ende nur die Zeilen
>
> "Bandname - Titel"
>
> übrig bleiben.
>
> Man muss also z.B. per Kommandozeile oder Prog also nach Doppelpunkt und
> dem Wort "itunes" suchen und alles da drin liegende löschen.

Mit sed oder grep ist das aber leider nicht ganz einfach, weil die per 
Default immer nur zeilenweise arbeiten. Damit ist es dann nur mit 
Verrenkungen möglich, alles ab der Zeile, in der ein Doppelpunkt 
vorkommt bis einschließlich der Zeile, in der das nächste mal "iTunes" 
vorkommt, zu löschen.

Aber mal eine ganz andere Frage:

● J-A V. schrieb:
> Ich habe eine laaange Textdatei, Playlist von einer Webseite.
>
> dort sind 2 verschiedene immer wiederkehrende Zeilen und der Text
> dazwischen kann gelöscht werden. Das würde die Datei erheblich kürzen.

Wieviele Gigabytes ist diese Playliste denn "laaang"? Oder anders: Warum 
ist die Größe denn überhaupt ein Problem?

von Yalu X. (yalu) (Moderator)


Bewertung
0 lesenswert
nicht lesenswert
● J-A V. schrieb:
> also meine Vorstellung ist die, dass ich alles,
> was zwischen dem Zeichen ":" und dem Wort "iTunes" liegt löschen möchte.

Ist denn garantiert, dass ":" und "iTunes" nicht auch in einem der
Bandnamen oder einem der Titel auftauchen? Sonst wird's schwierig.

Man kann natürlich nach Zeilen suchen, die ausschließlich eine
Zeitangabe der Form mm:ss bzw. das Wort "iTunes" enthalten. Aber wenn es
tatsächlich eine Band namens iTunes oder einen Song namens 08:15 gibt,
was dann?

Könnte es auch passieren, dass bei einem Eintrag die Zeitdauer oder das
"iTunes" fehlt? Dies könnte dazu führen, dass zu viele Zeilen aus der
Datei gelöscht werden.

> jetzt stelle man sich mal eine hunderte Seiten lange Liste vor,
> in der Namen so lang sind, dass es Zeilenumbrüche gibt,
> dass man immer mal wieder mehrere Leerzeilen dazwischen hat,
> in der nicht immer 4 Zeilen dazwischen liegen (auch mal 3 oder 5)
> uswusf.

Ich dachte ursprünglich, die Datei hätte ein festes, klar definiertes
Format, so dass sie auch von einem Abspielprogramm gelesen werden kann.
Aber das geht ja alleine schon wegen der Zeilenumbrüche nicht ohne
weiteres.

von ● Des I. (Firma: FULL PALATINSK) (desinfector) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Ach ich bin blöd, ich hab immer verkehrt gedacht.
Ich hab immer die zu löschenden Zeilen im Kommando anzugeben versucht.

man kann doch auch das was stehen bleiben soll angeben.
Dann sieht das Kommando nur noch so aus:

grep "-" old.txt > new.txt

ich bin halt "konsolenblind" ;)

von Yalu X. (yalu) (Moderator)


Bewertung
0 lesenswert
nicht lesenswert
● J-A V. schrieb:
> Dann sieht das Kommando nur noch so aus:
>
> grep "-" old.txt > new.txt

Das klappt aber nicht, wenn der Bandname (vor dem "-") oder der Titel
(nach dem "-") einen Zeilenumbruch enthält.

von ● Des I. (Firma: FULL PALATINSK) (desinfector) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Yalu X. schrieb:
> Das klappt aber nicht, wenn der Bandname (vor dem "-") oder der Titel
> (nach dem "-") einen Zeilenumbruch enthält.

das kommt so wenig vor, dass ich das händisch erstmal aussortieren kann.
Vollständig kann eine solche Liste eh nie sein.

von Amateur (Gast)


Bewertung
0 lesenswert
nicht lesenswert
>das kommt so wenig vor, dass ich das händisch erstmal aussortieren kann.
>Vollständig kann eine solche Liste eh nie sein.
... und wenn Du nur einmal übersiehst, dann fehlen einige Titel.

Diese Playlisten wurden von verschiedenen Leuten geschrieben, demzufolge 
sind sie auch nicht homogen.
Geh' mal davon aus, dass irgendwo ein Doppelpunkt in irgendeinem 
Bandnamen vorkommt und auch ein Titel mit einer Zeitangabe ist dabei;-)

von c.m. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Amateur schrieb:
>>das kommt so wenig vor, dass ich das händisch erstmal aussortieren kann.
>>Vollständig kann eine solche Liste eh nie sein.
> ... und wenn Du nur einmal übersiehst, dann fehlen einige Titel.

dann müsste man halt vollständig syntaktisch parsen.
1
STILTSKIN - INSIDE
2
06:11
3
STILTSKIN
4
INSIDE
5
iTunes

erste zeile enthält $string1+" - "+$string2
zweite zeile enthält dezimal+":"+dezimal
dritte zeile $string1
vierte $string2
fünfte "iTunes"

wenn das alles zutrifft, ist $string1+" - "+$string2 der komplette 
gesuchte string.
händisch müsste man dann nur noch zeilen1 auswerten die mehrere " - " 
enthalten. aber das kann man ja abfangen und loggen.

von Kommandozeile vor dem Frühstück für Alle! (Gast)


Bewertung
0 lesenswert
nicht lesenswert
> Dann sieht das Kommando nur noch so aus:
>
> grep "-" old.txt > new.txt
>
> ich bin halt "konsolenblind" ;)

Achtung: " - " - nicht "-"!

(Zumindest gemäss den vorgelegten Musterdaten...)

von Kommandozeile vor dem Frühstück für Alle! (Gast)


Bewertung
0 lesenswert
nicht lesenswert
> Eine simple Kommandozeilen-App schreiben, die im Text nach Zeilen sucht,
> welche eine Uhrzeit-Angabe enthalten, als nummer:nummer und nix weiters.
> Dann die jeweils DAVOR liegende Zeile in die Ausgabedatei schreiben.
>
> Ich vermute mal, daß man sowas mit grep und Konsorten nicht wirklich
> hinkriegt. Aber in Pascal geschrieben ist das nur ein recht kurzer
> Quelltext.

<ungeprüft  Quelle="ausmÄrmel">
1
$ grep -B1 -P '/d+:/d/d' laaaangedatei ¦ sed 'n;d' > kurzedatei

Mir ist nicht bekannt dass in Pascal "Einzeiler" möglich sind... ;-)
Zeig her dein code!

von Schnellmodus (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Kommandozeile vor dem Frühstück für Alle! schrieb:

>
> Mir ist nicht bekannt dass in Pascal "Einzeiler" möglich sind... ;-)
> Zeig her dein code!


kürzer, fast schon ein Einzeller,

awk - datei  >  dateineu

von Schnellmodus (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Schnellmodus schrieb:
> Kommandozeile vor dem Frühstück für Alle! schrieb:
>
>>
>> Mir ist nicht bekannt dass in Pascal "Einzeiler" möglich sind... ;-)
>> Zeig her dein code!
>
>
> kürzer, fast schon ein Einzeller,
>
> awk - datei  >  dateineu


etwas zu kurz geraten

1
 awk /-/ datei  >  dateineu

von Kommandozeile vor dem Frühstück für Alle! (Gast)


Bewertung
0 lesenswert
nicht lesenswert
> Auch mit grep & co. ist das kein Problem, wenn man mit regulären
> Ausdrücken ("regex") umgehen kann. Die sind für derartige Aufgaben
> erfunden worden. Sehen zwar aus, als hätte eine Katze auf die Tastatur
> gekotzt, sind aber wirklich sehr, sehr mächtig.

REs (regular expressions) sind für Anfänger, echte Männer nutzen PCREs 
;-)

<ungeprüft Quelle="ausmÄrmel">
1
$ cat laaaaangedatei ¦ tr '\n' '\0' ¦ grep -o -P '(?<iTunes\0).* - [^\0]*(?=\0\d+:\d\d)' > kurzedatei

Stichworte: lookahead und lookbehind assertions - einfach nach 
"PCRE.TXT" googlen und lesen.

von Kommandozeile vor dem Frühstück für Alle! (Gast)


Bewertung
0 lesenswert
nicht lesenswert
> etwas zu kurz geraten
>
>
1
 awk /-/ datei  >  dateineu

Immernoch zu kurz, achtet auf die Leerzeichen!
1
 awk '/ - /' datei  >  dateineu
Ist aber selbe Schublade wie
1
 grep ' - ' datei  >  dateineu
(erster Antwortpost)



Uuund: ich warte auf den Pascal-Einzeiler ;-)

von Marcus H. (mharnisch) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
sed -nre '/^[0-9]{2}:[0-9]{2}/,/^iTunes/d;p'

von Norbert (Gast)


Bewertung
2 lesenswert
nicht lesenswert
W.S. schrieb:
> Ich vermute mal, daß man sowas mit grep und Konsorten nicht wirklich
> hinkriegt.

Tja, da bewahrheitet sich mal wieder der alte Spruch:

Wer nichts Weiß muss alles Glauben   ;-)

von afggjgcjzc (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Rufus Τ. F. schrieb:
> Sehen zwar aus, als hätte eine Katze auf die Tastatur
> gekotzt, sind aber wirklich sehr, sehr mächtig.

Unsere laufen nur drueber, das Ergebnis sieht aber aehnlich aus;-)
Und ja, die Moeglichkeiten sind gewaltig.

afggjgcjzc

von ● Des I. (Firma: FULL PALATINSK) (desinfector) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Norbert schrieb:
> W.S. schrieb:
>> Ich vermute mal, daß man sowas mit grep und Konsorten nicht wirklich
>> hinkriegt.
>
> Tja, da bewahrheitet sich mal wieder der alte Spruch:
>
> Wer nichts Weiß muss alles Glauben   ;-)

eine kleine grep-Zeile hat mein Problem längst erschlagen ;)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.