Eu tenho um arquivo vcf que contém vários cartões postais.
Ao importar o arquivo vcf para o Outlook, parece importar apenas o primeiro vcard.
Por isso, quero dividi-los.
Dado que um vcard começa com
BEGIN:VCARD
e termina com
END:VCARD
Qual é a melhor maneira de dividir cada vcard em seu próprio arquivo.
obrigado
ATUALIZAR
Obrigado por todas as respostas. Tal como acontece com questões desta natureza, existem várias maneiras de esfolar um gato. Aqui está o raciocínio pelo qual escolhi o que fiz.
ARREDONDAR PARA CIMA
Aqui está um resumo do que eu gostei em cada resposta e o que me levou a selecionar uma delas.
csplit
: Eu realmente gostei da concisão desse método. Eu só queria que também fosse possível definir a extensão do arquivo.gawk
: Fez tudo o que eu pedi.paralell
: Trabalhou. Mas eu tive que instalar coisas novas. (também decidiu criar um novo diretório / bin no meu diretório doméstico)perl
: Gostei que ele criou vcf com base no nome do contato. Mas a opção -o realmente não funcionou
Conclusão
- Então o primeiro a ir foi
perl
porque estava um pouco quebrado - Em seguida foi
paralell
porque eu tive que instalar coisas novas - Em seguida
csplit
, porque, tanto quanto eu posso ver, não é possível criar extensões nos arquivos de saída - Portanto, o prêmio vai para o gawk, por ser um utilitário prontamente disponível e versátil o suficiente para que eu possa cortar e alterar um pouco o nome do arquivo. Marcas de bônus para
cmp
também :)
-b
?Respostas:
Você pode usar o awk para o trabalho:
Detalhes
A linha awk funciona assim:
a
é um contador incrementado em cadaBEGIN:VCARD
linha e, ao mesmo tempo, o nome do arquivo de saída é construído usando o sprintf (armazenado emfn
). Para cada linha, a linha atual ($0
) é anexada ao arquivo atual (nomeadofn
).O último
echo $?
significa que ocmp
arquivo foi bem-sucedido, ou seja, todos os arquivos únicos concatenados são iguais ao exemplo original exemplo vcf.Observe que o redirecionamento de saída no awk funciona de maneira diferente do que no shell. Isso significa que, com o
> fn
awk, primeiro verifica se o arquivo já está aberto. Se já estiver aberto, o awk será anexado a ele . Caso contrário, ele será aberto e truncado.Devido a essa lógica de redirecionamento, precisamos fechar explicitamente os arquivos abertos implicitamente, pois, caso contrário, a chamada atingiria o limite de arquivos abertos nos casos em que o arquivo de entrada contenha muitos registros.
fonte
fonte
A versão Gnu do csplit pode definir a extensão - a resposta de Ignacio, eu acho a mais concisa, só precisa do último pedaço de ajustes para obter a extensão - usando o formato 'printf':
Aqui está o trecho relevante da
csplit
página de manual do gnu :fonte
Você pode usar esse script para fazer o trabalho. É chamado split-vcf-file .
Exemplo de uso
Para executar o script:
fonte
Usando o GNU Parallel, você pode:
Ou, se você puder refutar http://oletange.blogspot.com/2013/10/useless-use-of-cat.html, poderá usar isso:
Veja mais exemplos: http://www.gnu.org/software/parallel/man.html
Assista aos vídeos de introdução: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
10 segundos de instalação:
fonte