Você pode usar awk
:
awk 'NR > 1{print line","}{line=$0;}END{print $0}' jsonfile
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}
Você pode usar sed
:
sed '$n;s/$/,/' file
$n;
significa que se a última linha apenas continuar. ,
no final da linha. -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
p
. 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
}
]
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
}
]
% 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.
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.
Tags text-processing json linux