divide o documento de 1200 páginas em 500 páginas e depois o restante

1

Eu sou novo no mundo Unix e tenho arquivos de texto que contêm 1200 páginas identificadas por ^L . Existe uma maneira eficaz de quebrar desse arquivo para ter 2 arquivos separados de 500 páginas cada e, em seguida, um terceiro com as páginas restantes.

Estou pensando em algo como ler o arquivo para localizar o primeiro ^L , em seguida, contar a próxima saída de 500 para o arquivo temporário, continuar lendo para criar o próximo arquivo temporário ou há uma maneira mais eficaz?

Meu script está escrito no bash kit de ferramentas MKS .

    
por gizmo 20.09.2017 / 03:58

4 respostas

7

Assumindo que cada página comece com ^L (um literal Ctrl + L ):

awk '/^L/ { p++ } (p-1) % 500 == 0 { f = FILENAME "-page-" p ".txt" } { print > f }' file.txt

Isso contaria as linhas com ^L e se a contagem menos 1 for um fator de 500 (página 1, página 501, página 1001 etc.), ela definirá a variável f em um nome de arquivo para gerar a seguinte texto em.

O ^L no código awk é não os dois caracteres ^ e L , mas um literal Ctrl + L (você pode digitar isto com Ctrl + V Ctrl + L ). Você também pode usar 4 no lugar disso.

Para um pequeno documento de teste test.txt :

^L
page 1
^L
page 2
^L
page 3
^L
page 4

... e mudando de 500 para 2 para teste, isso gera dois arquivos, test.txt-page-1.txt e test.txt-page-3.txt , cada um contendo duas linhas (marcador de página e texto) do arquivo de entrada.

test.txt-page-1.txt :

^L
page 1
^L
page 2

test.txt-page-3.txt :

^L
page 3
^L
page 4

Os arquivos que devem ser analisados aparentemente têm um cabeçalho antes do primeiro marcador de página. Esse cabeçalho precisa ser ignorado. A seguinte variação no comando awk acima faz isso:

awk '/^L/ { p++ } (p-1) % 500 == 0 { f = FILENAME "-page-" p ".txt" } p > 0 { print > f }' file.txt

Ao restringir a saída para quando p for maior que zero, exigimos que pelo menos um marcador de página tenha sido analisado antes de produzir qualquer coisa.

    
por 20.09.2017 / 08:21
3

Aqui está outra opção. Esta é uma âncora no caractere ^ L (suponho que seja um único caractere, octal 014 em vez dos dois literais ^ e L ) . Para o arquivo de dados de origem chamado original.txt , ele dividirá cada página em seu próprio arquivo. A partir daí, você pode concatená-los nos blocos necessários:

# GNU csplit
csplit --prefix='page_' --digits=4 original.txt $'/4/+1' '{*}'

# MKS csplit
csplit -f 'page_' -n 4 -k original.txt $'/4/+1' '{9999}'

# Concatenate the required sets of pages together
cat page_{0000..0499} > part_1.txt
cat page_{0500..0999} > part_2.txt
cat page_{1000..9999} > part_3.txt

# Tidy up
rm page_????
    
por 20.09.2017 / 12:16
1

Se um bom antigo gnu split puder ser usado:

split -t '^L' -l 500 bigFile part_ 
  • -t '^L' - o separador de unidade é ^ L
  • separe em arquivos com 500 unidades

  • no bash, para introduzir ^ L temos que digitar ^ V ^ L . Também é possível usar a notação octal: split -t $'4' ...

por 20.09.2017 / 12:28
-2

Este é um arquivo de texto ou um mais complexo (PDF, WORD, etc)? Talvez você deva experimentar o comando split do builtin. funciona algo assim

split -l1000 textfile

Isso será dividido em seu arquivo de texto em vários arquivos com 1.000 linhas cada.

    
por 20.09.2017 / 07:33