awk для фильтрации содержимого двух файлов

Вы можете восстановить свой домашний каталог или все домашние каталоги (т.е. все из / home ), / usr / local и / root оптом и без разбора. В остальном:

  • / usr : вообще не восстанавливайте это (кроме / usr / local ). Все содержимое управляется менеджером пакетов Debian. Просто верните файлы, переустановив те же пакеты, что и раньше. Фактически, если вы не внесли необычных изменений в свою систему, например, использовали dpkg-dirvert для замены элементов в / usr , вам может не понадобиться сохранять резервную копию ] / usr вообще (но оставьте / usr / local ).
  • / etc : распакуйте резервную копию в промежуточное место и выберите отдельные изменения для восстановления. Вы можете сравнить старую и новую версию с чем-то вроде diff -ru , но вы заметите много различий, которые следует игнорировать, например, системные пользователи с разными uid и разные файлы конфигурации из-за пакетов, которые были установлены ранее но не больше или наоборот. Восстанавливайте только те изменения, которые вы считаете изменениями, внесенными вами самостоятельно.
  • / var : очень похоже на / etc , но немного проще. Вы можете избавиться от больших частей / var из резервной копии, таких как / var / cache и, возможно, / var / log (если вам все равно о старых журналах) и полностью замените другие части, такие как / var / www из резервной копии. Третьи, такие как / var / lib , вы можете оставить, чтобы иметь возможность ссылаться на состояние старой системы, но не использовать их содержимое в новой системе.

Короче говоря, знание того, что можно заменить, а что нельзя заменять, требует обширных знаний о том, что это за части, и никаких кратких общих советов не подойдет. Вы можете попытаться восстановить файлы амбициозно, если хотите сэкономить время, но вы должны знать, что это рискованно. Самый безопасный вариант - выбрать из резервной копии именно то, что вам нужно.


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

1
11.04.2019, 01:24
2 ответа

Использованиеjoin:

join -t, -a 1 -1 8 -2 1 file1.txt file2.txt

Использованиеawk:

Сохраните содержимое первого файла в массиве с соответствующим индексом в качестве ключа и вызовите его при обработке второго файла:

awk -F "," '
    FILENAME=="file1.txt"{row[$8]=$0}
    FILENAME=="file2.txt"{OFS=","; print row[$1],$2}
' file*.txt

Для ваших новых требований:

awk -F "," '
    FILENAME=="file1.txt"{row[$8]=$0}
    FILENAME=="file2.txt"{row[$1]=row[$1]","$2}
    END{ for (i in row) print row[i] }
' file*.txt

Обратите внимание, это изменит сортировку .


Использованиеcsvsql:

Это также хороший вариант использования для csvsql, особенно потому, что приведенные выше решения не будут работать, если у вас есть текстовое поле с кавычками и разделителем внутри кавычек:

csvsql -H \
  --query  "select file1.*, file2.b from file1 left join file2 on file1.h == file2.a" \
  file*.txt
1
27.01.2020, 23:30

Я бы сначала перебрал меньший файл:

awk -F, -v OFS=, '
    NR == FNR    { weight[$1] = $2; next }
    $8 in weight { $(NF+1) = weight[$8] }
    1
' file2.txt file1.txt
1
27.01.2020, 23:30

Теги

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