Это может работать для вас:
# seq 1 15 | sed '/^1/!d' | sed -n '$='
7
Объяснение:
Удалить все строки, кроме совпадающих.Передайте эти совпадающие (игнорируемые) строки в другую команду sed
.Удалите все эти строки, но покажите номер строки только последней строки.Таким образом, в этом примере с 1 по 15 строки 1,10 - 15 игнорируются - всего 7 строк.
РЕДАКТИРОВАТЬ:
Извините, неправильно прочитал вопрос (все еще немного сбит с толку!):
sed 's,.*,sed "/&/!d;s/.*/matched &/" input.txt| uniq -c,' ignore.txt | sh
Показывает номер matches
для каждого шаблона в ignore.txt
sed 's,.*,sed "/&/d;s/.*/non-matched &/" input.txt | uniq -c,' ignore.txt | sh
Показывает номер non-matches
для каждого шаблона в ignore.txt
Если используется GNU sed
, они также должны работать:
sed 's,.*,sed "/&/!d;s/.*/matched &/" input.txt | uniq -c,;e' ignore.txt
или
sed 's,.*,sed "/&/d;s/.*/non-matched &/" input.txt | uniq -c,;e' ignore.txt
NB Ваш успех с шаблонами может отличаться, т.е. заранее проверьте метасимволы.
При отражении я подумал, что это можно улучшить до:
sed 's,.*,/&/i\\matched &,;$a\\d' ignore.txt | sed -f - input.txt | sort -k2n | uniq -c
или
sed 's,.*,/&/!i\\non-matched &,;$a\\d' ignore.txt | sed -f - input.txt | sort -k2n | uniq -c
Но НЕТ, для больших файлов это на самом деле медленнее.