Einträge in Array aus einer Datei löschen

Datum: 2004-01-26
Quelle: suse-linux

Worum ging es?

Es ging darum, die in einem bash-Array vorliegenden Einträge aus einer Datei auszusondern. Wenn im Array z. B. die Werte 1, 2, und 4 vorhanden sind, sollen diese aus einer Datei mit den Zeilen 1, 2, 3, 4, 5 extrahiert werden, so dass nur 3 und 5 übrig bleiben (als Beispiel - der Zweck war das Aussondern von Pfadnamen für ein Delta-Backup). Normalerweise würde man jetzt wilde bash-Hacks erwarten, aber ich hatte kurz vorher ausgiebig mit dem Befehl comm gearbeitet, der für solche Aufgaben ideal geeignet ist - vor allem dann, wenn es um größere Datenmengen geht.

Code
# Datei mit den zu bearbeitenden Zeilen sortieren, Doubletten raus
# sort the input file, remove doubles
sort -u file1 >file1.tmp
# Bash-Array sortiert und um Doubletten bereinigt in temp. Datei packen
# sort and unify the bash array, store the list in a temp file
for i in ${zahl[*]}; do echo $i; done | sort -u >file2.tmp
# comm anwenden / call comm
comm -23 file1.tmp file2.tmp >result
Beschreibung

Das Schöne am comm ist, dass er über die Optionen gesteuert genau die Zeilen ausspuckt, die man sehen will. In diesem Fall werden alle Zeilen verworfen, die nur in Datei 2 (file2.tmp) oder in beiden Dateien (file1.tmp und file2.tmp) auftreten. Das Resultat ist also eine Liste der Zeilen, die nur in file1.tmp vorhanden sind - genau das, was wir brauchen.