Попробуйте с другой стороны: создайте снимок R/W, используйте его в качестве нового основного, сделайте "некоторые эксперименты" на старом, затем просто отбросьте содержание старых.
Статья "Забава BTRFS" может быть полезной.
С GNU grep
следующее должно работать. Используя -f
опция, передача file1.txt
как "файл шаблона" - но также и передача это во втором разе как файл данных. Использовать -o
сообщить только о частях соответствия. Наконец извлекают те слова, которые соответствуют только однажды - они соответствуют строкам от file1.txt
это не находит соответствие в file2.txt
.
grep -h -o -f file1.txt file2.txt file1.txt | sort | uniq -u
ijkl
Вы могли сделать это с 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
, мы ищем подстроки вместо того, чтобы соответствовать регулярным выражениям.
Поскольку мы удаляем слово из массива, как только мы находим соответствие, мы избегаем ненужных поисков.
w[$0]
имеет побочный эффект добавления ключа к массиву.
– Kaz
21.06.2013, 02:26
if (a[$1])
вместо if ($1 in a)
например. Это имеет место каждого awk
включая оригинал awk
и nawk
, но смотря на стандарт вчера, я не мог найти, что он указал.
– Stéphane Chazelas
21.06.2013, 10:19
file1
не огромно (для некоторого значения огромных), я предпочел бы это решение, поскольку оно не требует никакой сортировки file2
и, как ожидали бы, будет намного более эффективным.
– jw013
25.06.2013, 22:52
sort file1.txt <(grep -of file1.txt file2.txt) | uniq -u
, но, как Ваше решение, это только работает, когда файл шаблона на самом деле не содержит regex метасимволов. – rici 20.06.2013, 21:12grep -oFf file1.txt file2.txt | sort file1.txt - | uniq -u
– Stéphane Chazelas 21.06.2013, 12:42