atualiza o arquivo json

3

Eu tenho um arquivo file , na verdade json. Como posso adicionar uma vírgula ao final de todas as linhas, exceto da última? Por exemplo:

{"a":1, "b":1, "c":2}
{"a":3, "b":3, "c":1}
{"a":1, "b":2, "c":3}

O que eu quero:

{"a":1, "b":1, "c":2},
{"a":3, "b":3, "c":1},
{"a":1, "b":2, "c":3}
    
por Guforu 28.08.2015 / 11:40

6 respostas

3

Você pode usar awk :

awk 'NR > 1{print line","}{line=$0;}END{print $0}' jsonfile
    
por 28.08.2015 / 11:42
3

Você pode usar sed :

sed '$n;s/$/,/' file
  • O $n; significa que se a última linha apenas continuar.
  • Senão, adiciona um , no final da linha.
  • Se você adicionar o -i flag (não POSIX), o arquivo será editado no lugar.

Se deve ser awk :

awk 'NR>1{print p} {p=$0","}END{print}' file1
  • Armazena o conteúdo da linha em uma variável p .
  • A variável é impressa, exceto na última linha.
  • Quando a entrada chega ao fim, a última linha é impressa como está.
por 28.08.2015 / 11:54
0

Que tal em perl :

#!/usr/bin/perl

use strict;
use warnings;

use JSON;

my $json_list; 
while ( my $json_str = <> ) { 
    push ( @$json_list, from_json ( $json_str ) );
}

print to_json ( $json_list, { pretty => 1, canonical => 1 } );

Recebe dados sobre STDIN ou myscript.pl somefilename e recebe a entrada que você designou e cria um array JSON a partir disso.

Resultado:

[
   {
      "a" : 1,
      "b" : 1,
      "c" : 2
   },
   {
      "a" : 3,
      "b" : 3,
      "c" : 1
   },
   {
      "a" : 1,
      "b" : 2,
      "c" : 3
   }
]
    
por 28.08.2015 / 11:50
0

O arquivo original é, na verdade, JSON delimitado por Newline (NDJSON).

Em vez de usar ferramentas GNU, eu recomendo instalar o json do NPM.

# say the file is test.log
$ json -f test.log -g
[
  {
    "a": 1,
    "b": 1,
    "c": 2
  },
  {
    "a": 3,
    "b": 3,
    "c": 1
  },
  {
    "a": 1,
    "b": 2,
    "c": 3
  }
]
    
por 28.08.2015 / 12:08
0

% purobash:

while read line
do
    echo "$line,"
done < <(head -n-1 testfile)
echo 'tail -n1 testfile'

Este script anexa ',' a todas as linhas, exceto a última, e depois imprime a última linha inalterada.

    
por 28.08.2015 / 12:02
0

Parece que o objetivo real é produzir um array JSON a partir de um fluxo de entidades JSON. Uma ótima ferramenta para qualquer coisa relacionada ao JSON é

A tarefa de converter um arquivo (digamos input.txt) de entidades JSON em um array JSON é tão simples quanto:

$ jq -s . input.txt

jq também pode receber entrada de STDIN.

    
por 07.09.2015 / 05:46