Ich habe eine vcf-Datei, die zahlreiche vcards enthält.
Beim Importieren der vcf-Datei in Outlook wird anscheinend nur die erste vcard importiert.
Daher möchte ich sie aufteilen.
Vorausgesetzt, eine vcard beginnt mit
BEGIN:VCARD
und endet mit
END:VCARD
Was ist der beste Weg, um jede vCard in eine eigene Datei aufzuteilen.
Vielen Dank
AKTUALISIEREN
Vielen Dank für alle Antworten. Wie bei Fragen dieser Art gibt es verschiedene Möglichkeiten, eine Katze zu häuten. Hier ist die Begründung, warum ich die gewählt habe, die ich getan habe.
ZUSAMMENFASSEN
Hier ist eine Zusammenfassung dessen, was mir aus jeder Antwort gefallen hat und was mich dazu bewogen hat, eine davon auszuwählen.
csplit
: Ich mochte die Prägnanz dieser Methode wirklich sehr. Ich wünschte nur, es könnte auch die Dateierweiterung setzen.gawk
: Es hat alles getan, was ich verlangt habe.paralell
: Hat funktioniert. Aber ich musste neue Dinge installieren. (Es wurde auch beschlossen, ein neues / bin-Verzeichnis in meinem Heimatverzeichnis zu erstellen.)perl
: Es hat mir gefallen, dass vcf basierend auf dem Namen des Kontakts erstellt wurde. Aber die Option -o hat nicht wirklich funktioniert
Fazit
- Also war der erste, der ging,
perl
weil es ein bisschen kaputt war - Als nächstes
paralell
musste ich neue Dinge installieren - Als nächstes kam
csplit
, soweit ich sehen kann, keine Erweiterungen für die Ausgabedateien - Die Auszeichnung geht an gawk, weil es sich um ein Dienstprogramm handelt, das leicht verfügbar und vielseitig genug ist, um den Dateinamen ein wenig zu hacken und zu ändern. Bonuspunkte für
cmp
auch :)
-b
?Antworten:
Sie können awk für den Job verwenden:
Einzelheiten
Die awk-Zeile funktioniert folgendermaßen:
a
ist ein Zähler, der in jederBEGIN:VCARD
Zeile erhöht wird , und gleichzeitig wird der Ausgabedateiname mit sprintf (gespeichert infn
) erstellt. Für jede Zeile wird die aktuelle Zeile ($0
) an die aktuelle Datei (benanntfn
) angehängt .Letzteres
echo $?
bedeutet, dass dascmp
erfolgreich war, dh alle verketteten Einzeldateien entsprechen dem ursprünglichen Beispiel vcf example.Beachten Sie, dass die Ausgabeumleitung in awk anders funktioniert als in shell. Das bedeutet, dass mit
> fn
awk zunächst geprüft wird, ob die Datei bereits geöffnet ist. Wenn es bereits geöffnet ist, hängt awk daran an . Ist dies nicht der Fall, wird es geöffnet und abgeschnitten.Aufgrund dieser Umleitungslogik müssen wir die implizit geöffneten Dateien explizit schließen , da andernfalls der Aufruf in Fällen, in denen die Eingabedatei viele Datensätze enthält, die Obergrenze für geöffnete Dateien überschreiten würde.
quelle
quelle
Die Gnu-Version von csplit kann die Erweiterung festlegen - Ignacios Antwort ist meines Erachtens die prägnanteste. Sie benötigt nur die letzte Feinabstimmung, um die Erweiterung zu erhalten - unter Verwendung des 'printf'-Formats:
Hier ist der relevante Ausschnitt aus der Gnu-
csplit
Manpage:quelle
Mit diesem Skript können Sie die Arbeit erledigen. Es heißt split-vcf-Datei .
Anwendungsbeispiel
So führen Sie das Skript aus:
quelle
Mit GNU Parallel können Sie:
Oder wenn Sie http://oletange.blogspot.com/2013/10/useless-use-of-cat.html widerlegen können, können Sie dies stattdessen verwenden:
Weitere Beispiele finden Sie unter: http://www.gnu.org/software/parallel/man.html
Sehen Sie sich die Intro-Videos an: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
10 Sekunden Installation:
quelle