2 textdateien vergleichen und alle bestimmte Einträge löschen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
michaa7
Beiträge: 4632
Registriert: 12.12.2004 00:46:49
Lizenz eigener Beiträge: MIT Lizenz

2 textdateien vergleichen und alle bestimmte Einträge löschen

Beitrag von michaa7 » 11.03.2024 03:36:12

Datei A (von apt dist-upgrade zu entfernende Pakete)
Datei B (von apt dist-upgrade neu zu installierende Pakete)

--> Ausgabe Datei C mit allen <Paketname> aus A für die es in B kein <Paketname>t64 gibt.

Das schafft hier doch jemand auf einer Zeile?

Ziel des ganzen soll sein bei der derzeitigen noch unvollständigen transition (dist-) upgrades durchzuführen und dabei im Auge zu behalten was *ersatzlos* entfernt werden soll.
gruß

michaa7

-------------------------------
Menschen ändern gelegentlich ihre Ansichten, aber nur selten ihre Motive. (Oskar Negt)

Benutzeravatar
kalle123
Beiträge: 2714
Registriert: 28.03.2015 12:27:47
Wohnort: Mönchengladbach

Re: 2 textdateien vergleichen und alle bestimmte Einträge löschen

Beitrag von kalle123 » 11.03.2024 08:01:15

Zum Vergleich von zwei Textdateien (Konfigurationsdateien) kommt hier Debianmeld zum tragen. Aber ob das was für dich ist?

Gruß KH

tobo
Beiträge: 1996
Registriert: 10.12.2008 10:51:41

Re: 2 textdateien vergleichen und alle bestimmte Einträge löschen

Beitrag von tobo » 11.03.2024 08:47:04

Wenn du die Differenzmenge (A-B) suchst, also alle As, die nicht in B enthalten sind, dann würde ich mir mal `comm' anschauen.

Benutzeravatar
thunder11
Beiträge: 1343
Registriert: 19.04.2023 09:08:30

Re: 2 textdateien vergleichen und alle bestimmte Einträge löschen

Beitrag von thunder11 » 11.03.2024 08:52:53

Ist zwar nicht direkt gefragt, aber ich möchte trotzten mal das Protokoll von aptitude ins Spiel bringen.
Da gibt es drei Kategorien:
  • [REMOVE, NOT USED] ---> wird entfernt. Pakete, die sich dann nicht in [INSTALL, DEPENDENCIES] mit anderer Versionsnummer wiederfinden, sind dann futsch.
  • [INSTALL, DEPENDENCIES] ---> ersetzt [REMOVE, NOT USED] durch neue Version. Kann auch noch aus vorherigen Upgrades stammen, da noch nicht verfügbar
  • [UPGRADE] --> das Normale halt
  • [HOLD] neue Version eines Paketes erfüllt noch nicht die erforderliche Abhängigkeiten
Mal ein Beispiel. Ist ziemlich alt, da ich die Logs nicht mehr archiviere:

Code: Alles auswählen

Will install 25 packages, and remove 13 packages.
7500 kB of disk space will be freed
========================================
[REMOVE, NOT USED] libdazzle-1.0-0:amd64 3.36.0-1
[REMOVE, NOT USED] libdigest-bubblebabble-perl:amd64 0.02-2
[REMOVE, NOT USED] libebml4v5:amd64 1:1.3.10-dmo1
[REMOVE, NOT USED] libemail-valid-perl:amd64 1.202-1
[REMOVE, NOT USED] libhandy-0.0-0:amd64 0.0.13-2
[REMOVE, NOT USED] libmatroska6v5:amd64 1:1.5.2-dmo1
[REMOVE, NOT USED] libnet-dns-perl:amd64 1.25-1
[REMOVE, NOT USED] libnet-dns-sec-perl:amd64 1.17-1
[REMOVE, NOT USED] libnet-ip-perl:amd64 1.26-2
[REMOVE, NOT USED] libperl4-corelibs-perl:amd64 0.004-2
[REMOVE, NOT USED] libprotobuf-lite22:amd64 3.11.4-5
[REMOVE, NOT USED] libtext-levenshtein-perl:amd64 0.13-1
[REMOVE, NOT USED] libx264-160:amd64 4:0.160.3009+git4c9b076-dmo1
[INSTALL, DEPENDENCIES] libebml5:amd64 1:1.4.0-dmo1
[INSTALL, DEPENDENCIES] libmatroska7:amd64 1:1.6.0-dmo1
[INSTALL, DEPENDENCIES] libprotobuf-lite23:amd64 3.12.3-2
[UPGRADE] busybox:amd64 1:1.30.1-4 -> 1:1.30.1-5
[UPGRADE] gir1.2-polkit-1.0:amd64 0.105-26 -> 0.105-28
[UPGRADE] libnm0:amd64 1.25.91-2 -> 1.26.0-1
[UPGRADE] libpolkit-agent-1-0:amd64 0.105-26 -> 0.105-28
[UPGRADE] libpolkit-gobject-1-0:amd64 0.105-26 -> 0.105-28
[UPGRADE] libvlc-bin:amd64 1:3.0.11-dmo2 -> 1:3.0.11-dmo4
[UPGRADE] libvlc5:amd64 1:3.0.11-dmo2 -> 1:3.0.11-dmo4
[UPGRADE] libvlccore9:amd64 1:3.0.11-dmo2 -> 1:3.0.11-dmo4
[UPGRADE] network-manager:amd64 1.25.91-2 -> 1.26.0-1
[UPGRADE] policykit-1:amd64 0.105-26 -> 0.105-28
[UPGRADE] vlc:amd64 1:3.0.11-dmo2 -> 1:3.0.11-dmo4
[UPGRADE] vlc-bin:amd64 1:3.0.11-dmo2 -> 1:3.0.11-dmo4
[UPGRADE] vlc-data:amd64 1:3.0.11-dmo2 -> 1:3.0.11-dmo4
[UPGRADE] vlc-l10n:amd64 1:3.0.11-dmo2 -> 1:3.0.11-dmo4
[UPGRADE] vlc-plugin-base:amd64 1:3.0.11-dmo2 -> 1:3.0.11-dmo4
[UPGRADE] vlc-plugin-notify:amd64 1:3.0.11-dmo2 -> 1:3.0.11-dmo4
[UPGRADE] vlc-plugin-qt:amd64 1:3.0.11-dmo2 -> 1:3.0.11-dmo4
[UPGRADE] vlc-plugin-samba:amd64 1:3.0.11-dmo2 -> 1:3.0.11-dmo4
[UPGRADE] vlc-plugin-skins2:amd64 1:3.0.11-dmo2 -> 1:3.0.11-dmo4
[UPGRADE] vlc-plugin-video-output:amd64 1:3.0.11-dmo2 -> 1:3.0.11-dmo4
[UPGRADE] vlc-plugin-video-splitter:amd64 1:3.0.11-dmo2 -> 1:3.0.11-dmo4
[UPGRADE] vlc-plugin-visualization:amd64 1:3.0.11-dmo2 -> 1:3.0.11-dmo4
========================================

Log complete.
Ergänzung: der Log stammt noch aus einer Zeit, als ich den "Update Indikator" nutzte.
Da kamen [INSTALL, DEPENDENCIES] dann oft mit ein paar Stunden Verspätung.
Dieser blinkende Icon animierte mich dann, mehrmals an Tag Upgrades zu machen.
Jetzt mach ich immer Morgens mein Update und gut ist.

michaa7
Beiträge: 4632
Registriert: 12.12.2004 00:46:49
Lizenz eigener Beiträge: MIT Lizenz

Re: 2 textdateien vergleichen und alle bestimmte Einträge löschen

Beitrag von michaa7 » 11.03.2024 12:49:32

tobo hat geschrieben: ↑ zum Beitrag ↑
11.03.2024 08:47:04
Wenn du die Differenzmenge (A-B) suchst, also alle As, die nicht in B enthalten sind, dann würde ich mir mal `comm' anschauen.
Datei A: a, b, c, d, e, f,
Datei B: at64, ct64, et64, g, h, i

Ergibnis als Datei C: b, d, f (= alle Dateinen aus A für die es in B keine Entsprechung+t64 gibt)

oder vllt verständlicher:

foo(aus A) UND NICHT foot64(aus B) = foo(nach C)

Korrigiert, danke.
Zuletzt geändert von michaa7 am 11.03.2024 13:46:00, insgesamt 2-mal geändert.
gruß

michaa7

-------------------------------
Menschen ändern gelegentlich ihre Ansichten, aber nur selten ihre Motive. (Oskar Negt)

tobo
Beiträge: 1996
Registriert: 10.12.2008 10:51:41

Re: 2 textdateien vergleichen und alle bestimmte Einträge löschen

Beitrag von tobo » 11.03.2024 13:31:30

Falls du b, d, f meinst und mit deiner Anpassung der Dateien A und B:

Code: Alles auswählen

$ comm -23 <(sort -u A) <(sed 's/t64$//' B | sort -u)
b
d
f
$

michaa7
Beiträge: 4632
Registriert: 12.12.2004 00:46:49
Lizenz eigener Beiträge: MIT Lizenz

Re: 2 textdateien vergleichen und alle bestimmte Einträge löschen

Beitrag von michaa7 » 11.03.2024 14:00:18

tobo hat geschrieben: ↑ zum Beitrag ↑
11.03.2024 13:31:30
Falls du b, d, f meinst
in der Tat 8)
tobo hat geschrieben: ↑ zum Beitrag ↑
11.03.2024 13:31:30
und mit deiner Anpassung der Dateien A und B:
Ok,
apt-to-be-removed kopiert nach "A", dann

Code: Alles auswählen

cat A | tr " " "\n" > AA
und
apt-to-be-installed kopieret nach "B", dann

Code: Alles auswählen

cat B| tr " " "\n" > BB
;
nun

Code: Alles auswählen

comm -23 <(sort -u AA) <(sed 's/t64$//' BB | sort -u)
---> :D

Danke!

Und so verstehe ich das:
Aus man sed: s/RegAusdr/Ersatz/ und : "$ Passt auf die letzte Zeile"
wobei "letzte Zeile" wohl bedeutet "aktuell bearbeitet Zeile"? ... der Datei BB
Dort suche t64 und ersetze es mit nichts. Pipe das nach "sort" und sortiere das Ganze alphabetisch und ggf. nur einmal wenn mehrere gleiche.

"comm -23" = nur die erste Spalte=erste Datei=AA ausgeben
wobei Spalte 1 nur Zeilen anzeigt die exklusiv in Datei 1=AA vorkommen (die ZeilenNUMMER ist dabei offenbar egal! Deshalb alphabetisch, funktioniert wohl nach dem "erster-Treffer-Prinzip")

diesen Sed RegEx hätte ich nie hinbekommen ( das war rückwärts schon schwierig zu entziffern), aber "$" hinten anzuhängen, darauf wäre ich nicht gekommen und obwohl mir klar (?) ist dass "<" ne pipe in eine bestimmte Richtung ist weiß ich es trotzdem nicht anzuwenden. Den wirklich springenden Punkt zwischen "|", "<" und ">" raffe ich nicht, obwohl ich das schon mehrfach nachgelesen habe ... irgendwie nicht my cup of tea.

Nochmals Danke ... und ein bisschen was wird ja vllt doch hängen bleiben.
gruß

michaa7

-------------------------------
Menschen ändern gelegentlich ihre Ansichten, aber nur selten ihre Motive. (Oskar Negt)

tobo
Beiträge: 1996
Registriert: 10.12.2008 10:51:41

Re: 2 textdateien vergleichen und alle bestimmte Einträge löschen

Beitrag von tobo » 11.03.2024 17:20:08

michaa7 hat geschrieben: ↑ zum Beitrag ↑
11.03.2024 14:00:18
Und so verstehe ich das:
Aus man sed: s/RegAusdr/Ersatz/ und : "$ Passt auf die letzte Zeile"
wobei "letzte Zeile" wohl bedeutet "aktuell bearbeitet Zeile"? ... der Datei BB
Würde das $ vor dem Befehl (hier s(ubstitute) stehen, also z.B. sed '$s/t64//'), dann wäre es eine Adresse und würde die letzte Zeile ansprechen. Im Befehl selbst werden aber Zeilen verarbeitet und dann bezieht sich $ auf das Zeilenende. Wenn ansonsten keine t64 in den Paketnamen auftauchen, dann wäre $ sogar überflüssig.
Dort suche t64 und ersetze es mit nichts. Pipe das nach "sort" und sortiere das Ganze alphabetisch und ggf. nur einmal wenn mehrere gleiche.
Sortiert und entfernt Dubletten. Also was man auch mit `sort | uniq' machen könnte,
"comm -23" = nur die erste Spalte=erste Datei=AA ausgeben
wobei Spalte 1 nur Zeilen anzeigt die exklusiv in Datei 1=AA vorkommen (die ZeilenNUMMER ist dabei offenbar egal! Deshalb alphabetisch, funktioniert wohl nach dem "erster-Treffer-Prinzip")
Sortiert, weil comm das vorgibt und auf sortiertem Ausgangsmaterial arbeitet. -2 entfernt alles, was nur in B ist und -3 entfernt alles, was sowohl in A als auch B ist.
und obwohl mir klar (?) ist dass "<" ne pipe in eine bestimmte Richtung ist weiß ich es trotzdem nicht anzuwenden.
comm arbeitet mit 2 Dateien, hier liegen aber 2 Streams vor. Man könnte die beiden Streams also jeweils in eine Datei speichern (z.B. `sort -u A >AA') und dann mit `comm -23 AA BB' aufrufen oder man benutzt die Prozess-Substitution <(Kommandoliste) - den Ausgabestrom eines Prozesses als Eingabestrom eines anderen Prozesses. Es wird hier also das temporäre Anlegen zweier Dateien umgangen.

michaa7
Beiträge: 4632
Registriert: 12.12.2004 00:46:49
Lizenz eigener Beiträge: MIT Lizenz

Re: 2 textdateien vergleichen und alle bestimmte Einträge löschen

Beitrag von michaa7 » 11.03.2024 17:28:54

tobo hat geschrieben: ↑ zum Beitrag ↑
11.03.2024 17:20:08

Würde das $ vor dem Befehl (hier s(ubstitute) stehen, also z.B. sed '$s/t64//'),
Nee ich hätte es, fälschlicherweise, $t64 statt richtig t64$ geschrieben
... oder man benutzt die Prozess-Substitution <(Kommandoliste) - den Ausgabestrom eines Prozesses als Eingabestrom eines anderen Prozesses. Es wird hier also das temporäre Anlegen zweier Dateien umgangen.
Prozess-Substitution <(Kommandoliste) ... das muss ich mir einfach mal so merken ....

Danke nochmals.
gruß

michaa7

-------------------------------
Menschen ändern gelegentlich ihre Ansichten, aber nur selten ihre Motive. (Oskar Negt)

Antworten