Listen vergleichen mit comm

  Lioh Möller   Lesezeit: 2 Minuten  🗪 5 Kommentare

Mithilfe von comm lassen sich zwei sortierte Listen miteinander vergleichen.

listen vergleichen mit comm

Angenommen wir haben eine Textdatei datei_1.txt mit folgendem Inhalt:

GNU
Linux
Microsoft
Tux
Apple

und eine zweite Datei, welche Zeilen enthält, die aus der ersten Datei entfernt werden sollen, nennen wir sie datei_mit_zu_löschenden_zeilen.txt

Apple
Microsoft

Dazu eignen sich verschiedene Werkzeuge, beispielsweise comm, welches zwei sortierte Listen miteinander vergleichen kann. Ziel ist die Ausgabe einer um die Inhalte der 2. Datei bereinigte datei_1.txt.

Ohne die Angabe weiterer Parameter gibt comm folgende Spalten aus:

1 - Zeilen, welche nur in Datei 1 vorkommen
2 - Zeilen die nur in Datei 2 vorkommen
3 - Zeilen welche in beiden Dateien vorkommen

Um eine Spalte in der Ausgabe zu unterdrücken, kann der Parameter - gefolgt von der Spaltennummer angegeben werden. comm -12 würde beispielsweise nur Zeilen ausgeben, welche in beiden Dateien vorkommen.

Da wir allerdings datei_1.txt um den Inhalt der 2. Datei bereinigen möchten, muss der Parameter -23 genutzt werden. Darüber hinaus erwartet comm eine sortierte Liste als Eingabeformat.

 comm -23 <(sort datei_1.txt) <(sort datei_mit_zu_löschenden_zeilen.txt)

Kennst du weitere Methoden, um unter Linux das oben beschriebene Ziel zu erreichen? Teile sie uns in den Kommentaren oder in unserer Community mit.

Tags

Liste, Sortierfunktion, Bereinigung

Bluelupo
Geschrieben von Bluelupo am 7. Februar 2023 um 11:44

$ egrep -f datei_mit_zu_löschenden_zeilen.txt -v datei_1.txt

GNU

Linux

Tux

Lioh
Geschrieben von Lioh am 7. Februar 2023 um 17:16

Das funktioniert prima, egrep ist allerdings leider mittlerweile obsolete: https://git.savannah.gnu.org/cgit/grep.git/commit/src/egrep.sh?id=a9515624709865d480e3142fd959bccd1c9372d1

kamome
Geschrieben von kamome am 7. Februar 2023 um 18:20

Da dort grep -Fexplizit erwähnt wurde (statt fgrep), geht doch vermutlich auch grep -E weiterhin, oder?

Lioh
Geschrieben von Lioh am 7. Februar 2023 um 18:42

Ja, das würde so aussehen:

grep -E -f datei_mit_zu_löschenden_zeilen.txt -v datei_1.txt

Naja
Geschrieben von Naja am 7. Februar 2023 um 13:11

Mit 'grep -f' lassen sich Dateien vergleichen und mit '-v' das Ergebnis umkehren:

grep -vf datei_1.txt datei_mit_zu_löschenden_zeilen.txt

(Die Forumssoftware schmeißt die Unterstriche raus)