Руками такое не делают вовсе, тут работы на полчаса один раз.
Начните с ключа строки. Ключ это то, что не меняется у позиции между прогонами: код поставщика, в крайнем случае связка кода с размером или цветом. Название и адрес карточки ключом брать нельзя, они плывут. Если у поставщика кода нет совсем, придётся собирать свой из полей, которые не трогают, и хранить рядом с выгрузкой.
Дальше складываете рядом две выгрузки и считаете по ключу три множества. Появившиеся ключи, пропавшие ключи, общие ключи с разошедшимися значениями. Для третьего удобно держать хеш значимых полей, тогда сравнение сводится к сравнению двух коротких строк вместо обхода по колонкам.
awk -F';' 'NR>1{print $1";"$3";"$4}' vchera.csv | sort > a
awk -F';' 'NR>1{print $1";"$3";"$4}' segodnya.csv | sort > b
comm -23 a b > propalo.txt
comm -13 a b > poyavilos.txt
wc -l propalo.txt poyavilos.txt
Теперь про то, ради чего всё затевается. Голое число пропавших само по себе ничего не говорит, смотреть надо на долю и на её обычный размах. У поставщика с живым складом за полсуток пропадает процент позиций, иногда два. Увидели пятнадцать, значит обход не дошёл до части разделов, склад тут ни при чём.
Поэтому порог ставится по наблюдению. Первую неделю просто пишите долю в журнал, ничего не останавливая. Через семь дней у вас будет обычный размах, и порог берётся с запасом сверху. У меня по одному поставщику стоп идёт на семи процентах, по второму на трёх, потому что там каталог почти неподвижный.
И последнее: пропавшие позиции лучше не удалять сразу. Держу их сутки в карантине, помечаю в базе как под вопросом. Позиция вернулась в следующем прогоне, значит был обрыв. Не вернулась за сутки, тогда снимаю с витрины.