“Ungrep” - какие шаблоны не подобраны

Попробуйте с другой стороны: создайте снимок R/W, используйте его в качестве нового основного, сделайте "некоторые эксперименты" на старом, затем просто отбросьте содержание старых.

Статья "Забава BTRFS" может быть полезной.

13
20.06.2013, 21:00
2 ответа

С GNU grep следующее должно работать. Используя -f опция, передача file1.txt как "файл шаблона" - но также и передача это во втором разе как файл данных. Использовать -o сообщить только о частях соответствия. Наконец извлекают те слова, которые соответствуют только однажды - они соответствуют строкам от file1.txt это не находит соответствие в file2.txt.

grep -h -o -f  file1.txt file2.txt file1.txt | sort | uniq -u
ijkl
18
27.01.2020, 19:52
  • 1
    Очень хорошее описание. Спасибо и +1. –  unxnut 20.06.2013, 20:57
  • 2
    Вы могли достигнуть того же эффекта без grep ловкости: sort file1.txt <(grep -of file1.txt file2.txt) | uniq -u, но, как Ваше решение, это только работает, когда файл шаблона на самом деле не содержит regex метасимволов. –  rici 20.06.2013, 21:12
  • 3
    @rici, который является очень положительной стороной –  iruvar 20.06.2013, 21:16
  • 4
    : grep -oFf file1.txt file2.txt | sort file1.txt - | uniq -u –  Stéphane Chazelas 21.06.2013, 12:42

Вы могли сделать это с awk как:

awk '
  NR == FNR {w[$0]; next}
  {for (i in w) if (index($0,i)) delete w[i]}
  END {for (i in w) print i}' file1.txt file2.txt

При помощи index, мы ищем подстроки вместо того, чтобы соответствовать регулярным выражениям.

Поскольку мы удаляем слово из массива, как только мы находим соответствие, мы избегаем ненужных поисков.

10
27.01.2020, 19:52
  • 1
    я только принял бы этого. Это не вызывает O (n, регистрируют n), сортировка, и не перестал работать странно, когда шаблоны содержат regex метасимволы и могли быть расширены для поддержки regexes. –  Kaz 21.06.2013, 02:23
  • 2
    я не могу верить этому просто оценка w[$0] имеет побочный эффект добавления ключа к массиву. –  Kaz 21.06.2013, 02:26
  • 3
    @Kaz, да, который может сбивать с толку, и Вы находите много сценариев, не сознательно выделяющих элементы массива неумышленно путем выполнения if (a[$1]) вместо if ($1 in a) например. Это имеет место каждого awk включая оригинал awk и nawk, но смотря на стандарт вчера, я не мог найти, что он указал. –  Stéphane Chazelas 21.06.2013, 10:19
  • 4
    @Kaz Здесь является кавычкой POSIX: "Приложение должно гарантировать, что мультиопределенный размеры индекс, используемый с в операторе, заключается в скобки. В операторе, который тестирует на существование конкретного элемента массива, не заставлю тот элемент существовать. Любая другая ссылка на несуществующий элемент массива должна автоматически создать его". Это может быть найдено путем прокрутки абзаца или два отсюда. –  jw013 25.06.2013, 22:50
  • 5
    Пока file1 не огромно (для некоторого значения огромных), я предпочел бы это решение, поскольку оно не требует никакой сортировки file2 и, как ожидали бы, будет намного более эффективным. –  jw013 25.06.2013, 22:52

Теги

Похожие вопросы