Объединение перекрывающихся файлов во избежание повторения

У меня было другое понимание разрешений, теперь я вижу, что это так же просто, как изменить права доступа к каталогу или права собственности на каталог, и я могу запустить инструмент резервного копирования, указав заданный каталог.

Итак, я создал каталог /var/backups/home-backupкак sudo, а затем изменил владельца каталога с помощью sudo chown -R my_user_name /var/backups/home-backup, и теперь я могу использовать этот каталог в качестве целевого каталога резервного копирования.

Так что я также могу указать этот каталог в инструменте NAS, который копирует данные на внешнее устройство, и все работает так, как я хотел.

Извините за вопрос.из-за моего небольшого понимания системы каталогов Linux я думал, что не смогу легко получить доступ к каталогам вне дома от моего простого пользователя, не вводя каждый раз пароль.

3
16.07.2020, 06:36
2 ответа

кажущееся коротким и приятным решением этой проблемы является вездесущий, но также зловещий инструмент для удаления дубликатов awk:

awk '!x[$0]++'

он не только удаляет дубликаты, но и сохраняет исходный порядок входного файла (s ). вот объяснение того, как работает эта команда:Как работает awk '!a[$0]++'?

используется так

awk '!x[$0]++' file1 file2

будет напечатан файл1, затем файл2 без перекрытия. поскольку перекрытие дублируется, оно удаляется.

но будьте осторожны! он удалит все дубликаты из файлов. наблюдать:

$ cat file1
a
b
b
overlap1
overlap2

$ cat file2
overlap1
overlap2
p
q
q

$ awk '!x[$0]++' file1 file2
a
b
overlap1
overlap2
p
q

также удалены повторяющиеся строки, которые не перекрываются.

Если ваши файлы в противном случае не дублируются или вы все равно хотите от них избавиться, тогда эта команда подойдет.

Если вы хотите сохранить повторяющиеся строки, читайте дальше.

Вот способ вручную удалить перекрытие без удаления дубликатов. это можно автоматизировать, но я не прилагал усилий.

сначала получить последнюю строку из первого файла:

$ tail -n1 file1
overlap2

теперь удалите все строки из второго файла выше этой строки:

$ sed '0,/overlap2/d' file2
p
q
q

объединить файл1 с результатом второй команды, и вы получите объединенный файл без перекрытий, но с сохранением дубликатов

$ cat file1 <(sed '0,/overlap2/d' file2)
a
b
b
overlap1
overlap2
p
q
q

это работает и, вероятно, будет работать большую часть времени.

Но будьте осторожны! если перекрытие повторяется, это не удалит все перекрытия. наблюдать:

$ cat evil1
a
b
overlap1
overlap2
overlap3
overlap1
overlap2

$ cat evil2
overlap1
overlap2
overlap3
overlap1
overlap2
p
overlap2
q

определить последнюю строку первого файла

$ tail -n1 evil1
overlap2

удалить из второго файла по первому вхождению

$ sed '0,/overlap2/d' evil2
overlap3
overlap1
overlap2
p
overlap2
q

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

Так как же определить максимальное перекрытие? сначала найдите в файле2 каждое вхождение последней строки из файла1. для каждого теста вхождения, если он перекрывается. затем возьмите последнее вхождение, которое все еще перекрывалось.

найти каждое вхождение

$ grep -n overlap2 evil2
2:overlap2
5:overlap2
7:overlap2

проверить каждый на наличие перекрытия

$ diff -q <(tail -n2 evil1) <(head -n2 evil2)

$ diff -q <(tail -n5 evil1) <(head -n5 evil2)

$ diff -q <(tail -n7 evil1) <(head -n7 evil2)
Files /dev/fd/63 and /dev/fd/62 differ

отсутствие вывода означает отсутствие разницы. две линии перекрываются. пять строк также перекрываются. но семь строк больше не пересекаются. это означает, что появление в строке 5 является максимальным перекрытием, а появление в строке 7 не связано с перекрытием.

$ cat evil1 <(sed '1,5d' evil2)
a
b
overlap1
overlap2
overlap3
overlap1
overlap2
p
overlap2
q

как уже было сказано, это можно автоматизировать, но я не прилагал усилий.

связанные xkcd:https://xkcd.com/974/

по крайней мере, я приложил усилия для этого ответа. наслаждаться.

1
18.03.2021, 23:19

Вы можете использовать следующую команду, чтобы выполнить задание, если порядок не важен:

sort -u FILE1 FILE2 > FILE3

Если важен порядок файлов, используйте следующую команду:

cat -n FILE1 FILE2 | sort -uk2 | sort -nk1 | cut -f2- > FILE3
1
18.03.2021, 23:19

Теги

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