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.
$ egrep -f datei_mit_zu_löschenden_zeilen.txt -v datei_1.txt
GNU
Linux
Tux
Das funktioniert prima, egrep ist allerdings leider mittlerweile obsolete: https://git.savannah.gnu.org/cgit/grep.git/commit/src/egrep.sh?id=a9515624709865d480e3142fd959bccd1c9372d1
Da dort
grep -F
explizit erwähnt wurde (stattfgrep
), geht doch vermutlich auchgrep -E
weiterhin, oder?Ja, das würde so aussehen:
grep -E -f datei_mit_zu_löschenden_zeilen.txt -v datei_1.txt
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)