Divide um arquivo em vários arquivos

2

Eu tenho um arquivo que está no formato Json, como abaixo:

    {
        "sources":[{
        "field1":1000,
        "field2":"winevent_log",
        "field3":"winevent_log",
        "field4":"os_security",
        "field5":true,
        "field6":false,
      },{
        "field1":1001,
        "field2":"winperf_cpu",
        "field3":"winperf_cpu",
        "field4":"os_perf",
        "field5":false,
        "field6":false,
      },{
        "field1":1002,
        "field2":"winperf_disk",
        "field3":"winperf_disk",
        "field4":"os_perf",
        "field5":false,
        "field6":false,
      },{
        "field1":1003,
        "field2":"winperf_mem",
        "field3":"winperf_mem",
        "field4":"OS_perf",
        "field5":false,
        "field6":false,
      }
    }

Estou tentando dividi-lo em arquivos diferentes com base no delimitador. Eu gostaria de ver quatro arquivos diferentes, como abaixo:

arquivo 1:

    {
        "field1":1000,
        "field2":"winevent_log",
        "field3":"winevent_log",
        "field4":"os_security",
        "field5":true,
        "field6":false,
    }

arquivo 2:

    {
        "field1":1001,
        "field2":"winperf_cpu",
        "field3":"winperf_cpu",
        "field4":"os_perf",
        "field5":false,
        "field6":false,
    }

E assim por diante e assim por diante.

Eu tentei usar os comandos csplit e awk:

    csplit input_file '/"id"/' '{*}'
    awk '/,{/{n++}{print >"out" n ".json" }' input_file

Mas não obtive os output_files da maneira que eu esperava, porque o delimitador é distribuído em várias linhas e começa no meio de uma linha.

Alguém sabe como usar awk ou csplit de tal forma que o delimitador inicial seja "{newline" field1 "" enquanto o delimitador final é "}",

    
por Arun 14.07.2016 / 23:10

2 respostas

1

Uso de um endereço de intervalo (como em sed) e colocar de volta { e } com sprintf

awk '/field1/,/field6/ {if ($0 ~ /field1/) {i++;$0=sprintf("    {\n%s",$0)}; if ($0 ~ /field6/) {$0=sprintf("%s\n    }",$0)}; print > ("file" i)}' input_file

Existem algumas strings estáticas, se elas mudarem, você pode substituir por Regex.

    
por 20.07.2016 / 07:08
1

Supondo que o delimitador no seu caso seja },{ , você pode usar ex editor (parte do Vim) para dividir o arquivo, por exemplo:

ex +%j +'%s/},{/},\r{/g' +'g/./exe ".w! file".line(".").".txt"' -scq! -V1 file.txt

que unirá todas as linhas ( %j ), substituirá ( %s ) o conteúdo substituindo },{ por uma nova linha ( \r ) e, em seguida, gravará cada linha em um arquivo separado com base na linha atual número. A desvantagem é que sua parte componente está em uma linha, mas você pode desplugá-la novamente pela vírgula. Para mais detalhes, verifique: Como escrever cada linha em um arquivo separado?

    
por 15.07.2016 / 17:44

Tags