Как сравнить содержимое одного текстового файла с первой строкой другого и использовать оператор if в сценарии оболочки?
В настоящее время я делаю следующее в сценарии оболочки, чтобы сравнить вывод процесса (latest_sg.json
) с предыдущим выводом (latest_sg_prev.json
) и если они одинаковые, ничего не делай.
cmp -s latest_sg.json latest_sg_prev.json >/dev/null
if [ $? -ne 1 ]; then
sed -n '1p' latest_sg.json | sed -i '1r /dev/stdin' sg_monitor.json && sed -i '2s/$/,/' sg_monitor.json;
else
echo same
fi
Если они отличаются, скрипт должен скопировать новый контент в больший файл (sg_monitor.json
) в конце первой строки, затем добавьте запятую в конец этой строки.
Входной файл содержит пары значений:
{"value":"100","entry":"100","type":"sgv"}
Выходной файл выглядит так, когда все нормально:
[
{"value":"100","entry":"100","type":"sgv"},
{"value":"100","entry":"100","type":"sgv"},
{"value":"100","entry":"100","type":"sgv"}
]
Тем не менее, я обнаружил, что, если два входных файла совпадают, дополнительная запятая добавляется во 2-й строке в sg_monitor.json
файл как ниже:
[
{"value":"100","entry":"100","type":"sgv"},,
{"value":"100","entry":"100","type":"sgv"},
{"value":"100","entry":"100","type":"sgv"}
]
Это затем облажает процесс, который анализирует выходной файл.
Я бы хотел остановить это поведение, когда добавляется дополнительная запятая, когда latest_sg.json
а также latest_sg_prev.json
совпадают, и еще лучше было бы проверить содержание latest_sg.json
против первой линии sg_monitor.json
и если он уже существует, не предпринимайте никаких действий.
Как бы я это сделал?
2 ответа
Два наблюдения
1) Ты заявление what I'm finding happening is that if the two input files are the same, an additional comma is appended to the 2nd line in the sg_monitor.json
противоречит коду, который вы дали. Если оба файла равны, ваш код войдет в оператор else и он должен выполнить echo same
,
2) Вы пытаетесь добавить ,
найти персонажа S
на второй линии. Я предполагаю, что вы хотите добавить запятую в конце строки. Так что используйте $
вместо S
Вместо того, чтобы использовать
sed -i '2s/S/,/' sg_monitor.json
попробуйте использовать
sed -i '2s/$/,/' sg_monitor.json
Или вы можете попробовать что-то вроде
sed -i '2s/}/&,/' sg_monitor.json
где }
последний символ в строке 2
Ваша первая проблема в том, что вы работаете echo same
если 2 файла не равны От cmp
Man страница:
Состояние выхода равно 0, если входы одинаковы, 1, если отличается, 2, если проблема.
Измените оператор if на $? -eq 1
вместо $? -ne 1
, (Также вы можете пройти --quiet
в cmp
подавить вывод вместо того, чтобы передать его /dev/null
)
Я не совсем уверен, что эти команды должны делать, но вторая команда добавляет запятую в конце 2-й строки sg_monitor.json
:
sed -n '1p' latest_sg.json | sed -i '1r /dev/stdin' sg_monitor.json
sed -i '2s/$/,/' sg_monitor.json