Задача: есть два списка, А и В, в них — по 140000 и 550000 идентификаторов формата [0-9A-F]{12} по одному в строке. Список А является частью списка В. Надо составить список С, который представляет собой разницу между А и В, т. е. те идентификаторы, которые не упомянуты в первом списке но не упомянуты во втором.
Казалось бы решение простое — первый список по сути один большой regexp, и значения в нём надо лишь разделить вертикальной чертой, после чего подсунуть в sed на удаление.
#/bin/bash
# Если мы не на последней строке, то к концу линии дописать вертикальную черту.
# Потом в tr стереть все переводы строк.
regex=`sed -r '$ !s/$/|/g' ./list_A | tr -d '\n'`
# Подставляем regexp
sed -r '/'$regex'/d' ./list_B >./list_C