É possível separar um arquivo entre 4 arquivos 3 linhas de cada vez?

3

O problema é que o arquivo original pode conter de 0 a 45 linhas, mas sempre divisível por 3.

Eu tentei o comando split -l , mas ele cria muitos arquivos. Eu estava esperando que alguém me apontasse na direção certa, e eu não acho que split é isso.

Exemplo de arquivo original com 15 linhas:

lineAA|data|Format via FG|398
lineAB|data|Format via FG|398
lineAC|data|Format via FG|398
line_XA|data|Format via FG|398
line_XB|data|Format via FG|398
line_XC|data|Format via FG|398
line_ZA|data|Format via FG|398
line_ZB|data|Format via FG|398
line_ZC|data|Format via FG|398
line_XX|data|Format via FG|398
line_XY|data|Format via FG|398
line_XZ|data|Format via FG|398
line_FA|data|Format via FG|398
line_FB|data|Format via FG|398
line_FC|data|Format via FG|398
...

EXEMPLO DE SAÍDA:

ARQUIVO-1

    lineAA|data|Format via FG|398
    lineAB|data|Format via FG|398
    lineAC|data|Format via FG|398
    line_FA|data|Format via FG|398
    line_FB|data|Format via FG|398
    line_FC|data|Format via FG|398

ARQUIVO-2

    line_XA|data|Format via FG|398
    line_XB|data|Format via FG|398
    line_XC|data|Format via FG|398

ARQUIVO-3

    line_ZA|data|Format via FG|398
    line_ZB|data|Format via FG|398
    line_ZC|data|Format via FG|398

ARQUIVO-4

    line_XX|data|Format via FG|398
    line_XY|data|Format via FG|398
    line_XZ|data|Format via FG|398
    
por Emile 07.11.2017 / 21:06

3 respostas

3
Solução

awk :

awk 'BEGIN{ f=1 }!(NR%3){ n=NR+1 }NR==n{ f++ }
     { print > "STATUS_FILE-"f".txt" }!(NR%12){ f=0 }' file
  • BEGIN{ f=1 } - define o número inicial do índice de arquivos

  • !(NR%3) - avalia para true em cada terceira linha

  • f++ - número de índice do arquivo de incremento após cada terceira linha

  • !(NR%12){ f=0 } - redefine o número do índice do arquivo após cada 12ª linha (4ª seção)

  • print > "STATUS_FILE-"f".txt" - imprime a linha no arquivo com o número de índice de arquivo necessário

Visualizando resultados:

$ head STATUS_FILE*
==> STATUS_FILE-1.txt <==
lineAA|data|Format via FG|398
lineAB|data|Format via FG|398
lineAC|data|Format via FG|398
line_FA|data|Format via FG|398
line_FB|data|Format via FG|398
line_FC|data|Format via FG|398

==> STATUS_FILE-2.txt <==
line_XA|data|Format via FG|398
line_XB|data|Format via FG|398
line_XC|data|Format via FG|398

==> STATUS_FILE-3.txt <==
line_ZA|data|Format via FG|398
line_ZB|data|Format via FG|398
line_ZC|data|Format via FG|398

==> STATUS_FILE-4.txt <==
line_XX|data|Format via FG|398
line_XY|data|Format via FG|398
line_XZ|data|Format via FG|398

Para criar um script " awk " autônomo:

split_on_4x3.awk conteúdo do script:

#!/bin/awk -f

BEGIN { f=1 }
!(NR%3) { n=NR+1 }
NR==n { f++ }
{ print > "STATUS_FILE-"f".txt" }
!(NR%12) { f=0 }

Uso:

awk -f split_on_4x3.awk inputfile
    
por 07.11.2017 / 23:15
3

Isso gravará seu arquivo, em grupos de três linhas por vez, de forma cíclica para cada um dos file0.txt , file1.txt , file2.txt , file3.txt . Dividei-o em várias linhas, mas ele pode ser combinado como uma única linha simplesmente unindo as linhas:

awk '
    BEGIN { f=-1 }
    !( (NR-1) % 3) { f = (f+1) % 4 }
    { print > "file" f ".txt" }
' source.txt

Este programa awk tem três instruções. O bloco BEGIN {} é executado quando o programa é iniciado, antes da primeira linha ter sido lida. Cada linha de entrada é aplicada às duas instruções restantes. A primeira conta linhas em grupos de três ( NR contém o número da linha atual) e, no final de cada grupo, incrementa o número do arquivo, f . Quando o número do arquivo atinge o quarto item, ele é redefinido de volta para o primeiro. (Essa abordagem de contagem e reconfiguração usa o operador de módulo, % .)

    
por 07.11.2017 / 22:38
1

Parece que você quer usar split . De sua página de manual:

NAME
     split -- split a file into pieces

SYNOPSIS
     split [-a suffix_length] [-b byte_count[k|m]] [-l line_count] [-p pattern] [file [name]]

DESCRIPTION
     The split utility reads the given file and breaks it up into files of 1000 lines each.  If
     file is a single dash ('-') or absent, split reads from the standard input.

     The options are as follows: [...]


     -l line_count
             Create smaller files n lines in length.

split bigfile -l3 dividirá bigfile em arquivos menores, cada um com três linhas.

    
por 07.11.2017 / 21:40