Tengo un archivo vcf que contiene numerosas vcards.
Al importar el archivo vcf a Outlook, parece importar solo la primera vcard.
Por lo tanto, quiero dividirlos.
Dado que una vcard comienza con
BEGIN:VCARD
y termina con
END:VCARD
¿Cuál es la mejor manera de dividir cada vcard en su propio archivo?
Gracias
ACTUALIZAR
Gracias por todas las respuestas. Al igual que con las preguntas de esta naturaleza, hay varias formas de desollar a un gato. Aquí está el razonamiento por el que elegí el que hice.
REDONDEO
Aquí hay un resumen de lo que me gustó de cada respuesta y lo que me llevó a seleccionar una de ellas.
csplit
: Realmente me gustó la concisión de este método. Solo deseaba poder establecer también la extensión del archivo.gawk
: Hizo todo lo que le pedí.paralell
: Trabajó. Pero tuve que instalar cosas nuevas. (también decidió hacer un nuevo directorio / bin en mi directorio de inicio)perl
: Me gustó que creara vcf en función del nombre del contacto. Pero la opción -o realmente no funcionó
Conclusión
- Así que el primero en irse fue
perl
porque estaba un poco roto - Lo siguiente fue
paralell
porque tuve que instalar cosas nuevas - El siguiente fue
csplit
, porque hasta donde puedo ver, no puede crear extensiones en los archivos de salida - Entonces, el premio es para gawk, por ser una utilidad fácilmente disponible y lo suficientemente versátil que puedo cortar y cambiar un poco el nombre del archivo. Marcas de bonificación para
cmp
también :)
-b
?Respuestas:
Puedes usar awk para el trabajo:
Detalles
La línea awk funciona así:
a
es un contador que se incrementa en cadaBEGIN:VCARD
línea y al mismo tiempo el nombre del archivo de salida se construye usando sprintf (almacenado enfn
). Para cada línea, la línea actual ($0
) se agrega al archivo actual (denominadofn
).El último
echo $?
significa quecmp
fue exitoso, es decir, todos los archivos individuales concatenados son iguales al ejemplo original vcf.Tenga en cuenta que la redirección de salida en awk funciona de manera diferente que en shell. Eso significa que con
> fn
awk primero verifica si el archivo ya está abierto. Si ya está abierto, entonces awk se agrega a él . Si no es así, se abre y lo trunca.Debido a esta lógica de redireccionamiento, tenemos que cerrar explícitamente los archivos abiertos implícitamente, ya que de lo contrario la llamada alcanzaría el límite de archivos abiertos en los casos en que el archivo de entrada contiene muchos registros.
fuente
fuente
La versión Gnu de csplit puede establecer la extensión; creo que la respuesta de Ignacio es la más concisa, solo necesita ese último ajuste para obtener la extensión, usando el formato 'printf':
Aquí está el fragmento relevante de la
csplit
página de manual de gnu :fuente
Puede usar este script para hacer el trabajo. Se llama split-vcf-file .
Ejemplo de uso
Para ejecutar el script:
fuente
Usando GNU Parallel puedes hacer:
O si puede refutar http://oletange.blogspot.com/2013/10/useless-use-of-cat.html , puede usar esto en su lugar:
Ver más ejemplos: http://www.gnu.org/software/parallel/man.html
Mira los videos de introducción: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
Instalación de 10 segundos:
fuente