JSONが正しく構成されている

JSONが正しく構成されている

シェルスクリプトを使用してJSONファイルを生成していますが、「}」の末尾の前にある最後のコンマを自動的に削除する解決策が見つかりませんでした。

これは私のコードです。

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

ファイルは次のように終了します。

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

ファイルは次のように終了する必要があります。

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

この問題にどのように対処する必要がありますか?

ここでは、読みやすくするためにコードを編集しました。

ベストアンサー1

あなたがすべきことは、最初の項目を印刷してカーソルを止めることです。その後、ループ処理を開始し、コンマと改行を挿入してカーソルを前に移動できます。printfこの点ではエコーよりも役に立ちます。過度の重複を防ぎ、コードを短くするには、関数を使用してください。

awkで解析したファイルがないため、スクリプトは使用できません。しかし、以下の例は、私が渡したいものを示しています。

#!/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"  "}"

サンプルの実行

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

上記の方法は通常、「末尾にカンマを追加する」と呼ぶ方法です。別のアプローチは「コンマを準備する」ことですが、forループを使用する代わりにカウンター付きのwhileループを使用してCスタイルのforループの動作をシミュレートします。最後の項目に達すると、コンマは出力されません。オリジナル

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

おすすめ記事