Как сравнить содержимое одного текстового файла с первой строкой другого и использовать оператор 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
Другие вопросы по тегам