JSON construção correta

0

Estou gerando um arquivo JSON com um script de shell, mas não consigo encontrar uma solução para se livrar automaticamente da última vírgula antes do final "}".

Aqui está o meu código:

echo "{" >> out_file
for i in 3 4 5 6 7 #ends at 298
do
y=$i
sommeMag='awk -F '=' '/'$y'/{sommeMag+=$2}END{print sommeMag}'' "/myfolder/... "
store="mag$y"
if [ -z "$sommeMag" ] #checks is variable is empty
    then
        echo  "\"" $store"\"":0",">> out_file
    else
        echo "\""$store"\"":$sommeMag"," >> out_file
    fi
done
echo "}" >> out_file

O arquivo está terminando assim:

{
" mag297":0,
" mag298":0, <-- syntaxt error
}

O arquivo deve terminar assim:

{
...
" mag297":0,
" mag298":0 <-- no more comma
}

Como posso gerenciar isso?

O código foi editado para ser mais legível aqui.

    
por Matieu 26.05.2017 / 11:18

2 respostas

1

O que você deve fazer é imprimir o primeiro item e deixar o cursor parar. Então você pode começar a trabalhar no loop e avançar o cursor inserindo vírgula e nova linha. printf é mais útil que eco nesse aspecto. Para evitar a repetição excessiva e encurtar o código, use funções.

Como não tenho os arquivos que você está analisando com o awk, não posso trabalhar com o script, mas o exemplo abaixo ilustra o que estou tentando transmitir.

#!/bin/bash

print_entry(){
    # sommeMag would be variable $2, $1 is store
    if [ -z $2 ]
    then
        printf '"%s":0' "$1" 
    else
        printf '"%s":%s' "$1" "$2"
    fi
}

# main part of the script
printf "%s\n" "{"

# do the first one unconditionally but without comma
print_entry "something1" "something2"
for i in 2 3 4 5
do
    # because first one was printed unconditionally
    # now we just keep printing comma and moving cursor
    # to newline to insert the new entry
    printf ",\n"
    print_entry "something$i" "$i"
done
printf "\n%s"  "}"

Execução de amostra

$ ./make_json.sh                                                                                                                                      
{
"something1":something2,
"something2":2,
"something3":3,
"something4":4,
"something5":5
}$ 

A abordagem acima é tipicamente o que eu chamo de "adicionar vírgula atrás". Outra abordagem seria "Adicionar vírgula à frente", mas em vez de loop, use while loop com contador para simular o estilo C para o comportamento do loop. Se você chegar ao último item, não envie vírgula. Basicamente

counter=1
while [ $counter -le 298 ]
do
    $json_value=$(command1)
    if [ $counter -ne 298  ]
    then
        echo $json_value ,
    else
        echo $json_value
    fi 
    $counter=$(($counter+1))
done
    
por 26.05.2017 / 13:39
1
#
# var initialzizations
#
# newline
NL='printf '\nn'';NL=${NL%?}

# double quote
q=\"

# separator set to a comma+newline
sep=",$NL"

# container for the json result
json=;

# begin/end of count values
start=3
 stop=7

# looping
# in case seq utility not found, then you can use: yes | sed -ne "$start,$stop=;${stop}q"
for i in 'seq "$start" "$stop"'
do
   y=$i
   sommeMag='awk -F = "/$y/"'{sommeMag+=$2}END{print sommeMag}'' "/myfolder/... "
   store=mag$y
   json=${json:-}${json:+"$sep"}$q\ $store$q:${sommeMag:-0}
done

# remove the separtor from the end and also place a newline
json=${json%"$sep"}$NL

printf '{\n%s}\n' "$json" >> out_file
    
por 26.05.2017 / 16:55