Я создаю файл 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
}
Как мне это сделать?
Код был отредактирован, чтобы здесь было удобнее читать .
То, что вы должны сделать, это напечатать первый элемент и позволить курсору остановиться. Затем вы можете начать работать с циклом и перемещать курсор, вставляя запятую и новую строку. printf
более полезен, чем echo в этом отношении. Чтобы предотвратить чрезмерное повторение и сократить код, используйте функции.
Поскольку у меня нет файлов, которые вы анализируете с помощью 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
со счетчиком, чтобы имитировать поведение цикла for в стиле C. Если вы дойдете до последнего элемента, не выводите запятую. В основном
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
#
# 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