Tengo un archivo de texto que quiero dividir en 64 partes desiguales, de acuerdo con los 64 hexagramas del Yi Jing. Como el pasaje para cada hexagrama comienza con algunos dígitos, un punto y dos líneas nuevas, la expresión regular debería ser bastante fácil de escribir.
Pero, ¿cómo divido el archivo de texto en 64 archivos nuevos de acuerdo con esta expresión regular? Parece más una tarea para perl
. Pero tal vez hay una forma más obvia de que me estoy perdiendo por completo.
fuente
'\.'
¿no funcionará también?Creo que la mejor manera es
awk
ygawk
.awk
-F
especificará los campos separadores para cada línea. Es una expresión regular, aquí usamos múltiples separadores:". "
y" / "
. Por lo tanto, una línea como1. Ch'ien / The Creative
se dividirá en 3 campos:1
Ch'ien
yThe Creative
. Más adelante podemos referirnos a estos campos con$n
.$0
Es toda la línea.Luego le decimos a awk que combine las líneas con el patrón.
^[0-9]{1,3}[.]
Si hay una coincidencia, le asignamos un valorx
. El valor x se usará como nombre de archivo para laprint
operación. En este ejemplo usamos"F"$1"("$2").txt"
para que la línea1. Ch'ien / The Creative
dé un nombre de archivoF1(Ch'ien).txt
papar moscas
En gawk, también podemos acceder al grupo capturado. Entonces podemos simplificar el comando para:
Aquí usamos
match
la captura de los grupos y los colocamos en una lista variableary
.$0
Es toda la línea.ary[0]
es todo igualary[1...n]
es cada grupoperl
También podemos hacerlo con perl:
Resultados:
cómo obtener el archivo de ejemplo:
fuente
Con GNU coreutils, puede usar
csplit
para dividir un archivo en partes delimitadas por expresiones regulares , como lo muestra geekosaur .Aquí hay un script awk portátil para dividir un archivo en pedazos. Funciona por
getline
para tratar con el separador multilínea (2 líneas);outfile
al nombre del archivo para imprimir, cuando se encuentra un encabezado de sección.fuente
nunber.
le sigue un texto que contiene una barra inclinada/
. Estoy bastante seguro de que eltwo newlines
ixtmixilix mencionado son las 2 líneas en blanco que preceden al identificador numérico e identificarían más específicamente el encabezado, pero como los datos en la página web solo coinciden/^[0-9]+\.
en los encabezados de sección, no hay necesidad de atenderlos ( en este caso particular) Gracias; especialmente para la introducción agetline
... PS. puede ser si?while
está allí en caso de que la entrada contenga1.\n2.\n\n
(donde\n
hay líneas nuevas):2.
debe reconocerse en la línea del encabezado. Aquí no va a ocurrir, pero lo apoyo en mi código para hacerlo más general (y para que coincida con la especificación de la pregunta más estrictamente).