Eu tenho um arquivo de texto que quero dividir em 64 partes desiguais, de acordo com os 64 hexagramas do Yi Jing. Como a passagem para cada hexagrama começa com alguns dígitos, um ponto e duas novas linhas, a regex deve ser bem fácil de escrever.
Mas como eu realmente divido o arquivo de texto em 64 novos arquivos de acordo com este regex? Parece mais uma tarefa para perl
. Mas talvez exista uma maneira mais óbvia de que estou totalmente ausente.
regular-expression
split
ixtmixilix
fonte
fonte
'\.'
não vai funcionar também?Eu acho que o melhor caminho é
awk
egawk
.awk
-F
irá especificar os campos separados para cada linha. É uma regex, aqui usamos vários separadores:". "
e" / "
. Assim, uma linha como1. Ch'ien / The Creative
será dividida em 3 campos:1
Ch'ien
eThe Creative
. Mais tarde, podemos nos referir a esses campos com$n
.$0
é a linha inteira.Em seguida, dizemos ao awk para combinar as linhas com o padrão.
^[0-9]{1,3}[.]
Se houver correspondência, atribuímos valor ax
. O valor x será usado como nome de arquivo paraprint
operação. Neste exemplo, usamos"F"$1"("$2").txt"
para que a linha1. Ch'ien / The Creative
dê um nome de arquivoF1(Ch'ien).txt
gawk
No gawk, também podemos acessar o grupo capturado. Assim, podemos simplificar o comando para:
aqui usamos
match
a captura dos grupos e os colocamos na lista de variáveisary
.$0
é a linha inteira.ary[0]
é tudo combinado.ary[1...n]
é cada grupo.perl
Também podemos fazer isso com perl:
Resultados:
como obter o arquivo de exemplo:
fonte
Com o GNU coreutils, você pode usar
csplit
para dividir um arquivo em partes delimitadas por regexp, como mostra o geekosaur .Aqui está um script awk portátil para dividir um arquivo em pedaços. Funciona por
getline
para lidar com o separador de múltiplas linhas (2 linhas);outfile
para o nome do arquivo para imprimir, quando um cabeçalho da seção for encontrado.fonte
nunber.
é seguido pelo texto que contém uma barra/
. Tenho certeza de que otwo newlines
ixtmixilix mencionado são as duas linhas em branco que precedem o identificador numérico e identificariam mais especificamente o cabeçalho, mas como os dados na página da Web correspondem apenas/^[0-9]+\.
aos cabeçalhos das seções, não é necessário atendê-los ( neste caso em particular). obrigado; especialmente para a introdução agetline
.. PS. enquanto pode ser se?while
existe no caso de a entrada conter1.\n2.\n\n
(onde\n
estão as novas linhas): elas2.
devem ser reconhecidas na linha do cabeçalho. Isso não ocorrerá aqui, mas eu o apóio no meu código para torná-lo mais geral (e corresponder mais estritamente à especificação da pergunta).