Mam plik vcf, który zawiera wiele wizytówek.
Podczas importowania pliku vcf do programu Outlook wydaje się importować tylko pierwszą kartę vcard.
Dlatego chcę je podzielić.
Biorąc pod uwagę, że vcard zaczyna się od
BEGIN:VCARD
i kończy się na
END:VCARD
Jaki jest najlepszy sposób na podzielenie każdej karty vcard na własny plik.
Dzięki
AKTUALIZACJA
Dziękuję za wszystkie odpowiedzi. Podobnie jak w przypadku pytań tego rodzaju, istnieje wiele sposobów na skórowanie kota. Oto powód, dla którego wybrałem ten, który zrobiłem.
PODSUMOWANIE
Oto podsumowanie tego, co podobało mi się w każdej odpowiedzi i co skłoniło mnie do wybrania jednej z nich.
csplit
: Naprawdę podobała mi się zwięzłość tej metody. Chciałem tylko, żeby mógł ustawić rozszerzenie pliku.gawk
: Zrobił wszystko, o co prosiłem.paralell
: Pracował. Ale musiałem instalować nowe rzeczy. (postanowił także zrobić nowy / bin katalog w moim katalogu domowym)perl
: Podobało mi się, że stworzył vcf na podstawie nazwy kontaktu. Ale opcja -o tak naprawdę nie działała
Wniosek
- Więc pierwszy był,
perl
ponieważ był trochę zepsuty - Następnie
paralell
musiałem zainstalować nowe rzeczy - Dalej było
csplit
, ponieważ o ile widzę, nie może tworzyć rozszerzeń plików wyjściowych - Nagroda jest więc przyznawana gawk za to, że jest narzędziem łatwo dostępnym i wystarczająco wszechstronnym, że mogę trochę posiekać i zmienić nazwę pliku.
cmp
Również znaki bonusowe :)
-b
?Odpowiedzi:
Możesz użyć awk do zadania:
Detale
Linia awk działa w ten sposób:
a
jest licznikiem, który jest zwiększany w każdejBEGIN:VCARD
linii, a jednocześnie wyjściowa nazwa pliku jest konstruowana za pomocą sprintf (przechowywanego wfn
). Dla każdej linii bieżąca linia ($0
) jest dołączana do bieżącego pliku (o nazwiefn
).Ostatni
echo $?
oznacza, że sięcmp
powiódł, tzn. Wszystkie pojedyncze pliki skonkatenowane są równe oryginalnemu przykładowi vcf.Zauważ, że przekierowanie wyjścia w awk działa inaczej niż w powłoce. Oznacza to, że z
> fn
awk najpierw sprawdza, czy plik jest już otwarty. Jeśli jest już otwarty, dołącza do niego awk . Jeśli tak nie jest, otwiera się i obcina.Z powodu tej logiki przekierowania musimy jawnie zamknąć niejawnie otwarte pliki, ponieważ w przeciwnym razie wywołanie przekroczyłoby limit otwartych plików w przypadkach, gdy plik wejściowy zawiera wiele rekordów.
źródło
źródło
Wersja csplit w Gnu może ustawić rozszerzenie - odpowiedź Ignacio, myślę, że jest najbardziej zwięzła, potrzebuje tylko ostatniego ulepszenia, aby uzyskać rozszerzenie - używając formatu „printf”:
Oto odpowiedni fragment strony
csplit
man gnu :źródło
Możesz użyć tego skryptu, aby wykonać zadanie. Nazywa się to split-vcf-file .
Przykładowe użycie
Aby uruchomić skrypt:
źródło
Korzystając z GNU Parallel możesz:
Lub jeśli możesz obalić http://oletange.blogspot.com/2013/10/useless-use-of-cat.html , możesz użyć tego:
Zobacz więcej przykładów: http://www.gnu.org/software/parallel/man.html
Obejrzyj filmy wprowadzające: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
10 sekund instalacji:
źródło