Произведите общие строки (общие черты) двух текстовых файлов (противоположность разности)?

Формат файла tar является просто серией файлов, связанных вместе с несколькими заголовками. Это не очень сложное задание, чтобы разорвать его, вставить Ваше содержание и отложить его вместе. Однако Jander описал, как tar как программа не имеет служебных функций, чтобы сделать это и существуют дополнительные сложности со сжатием, которое имеет и к прежде и после внесения изменения.

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

Одна первая опция была бы archivemount проектом для FUSE. Вот учебное руководство на этом. Ваша система, вероятно, уже имеет FUSE и если это не делает Вашего распределения, должен иметь опцию для него.

Другая опция является tarfs. Более просто использовать, но я услышал, что это испытывает некоторые затруднения повредить архивы bzip2, таким образом, Вы могли бы протестировать это довольно полностью сначала.

22
14.10.2010, 05:03
5 ответов

Как насчет того, чтобы использовать разность, даже при том, что Вы не хотите разность? Попробуйте это:

diff --unchanged-group-format='@@ %dn,%df 
  %<' --old-group-format='' --new-group-format='' \
  --changed-group-format='' a.txt b.txt

Вот то, что я получаю с Вашими демонстрационными данными:

$ cat a.txt 
Foo Bar
X
Hello
World
42
$ cat b.txt 
Foo Baz
Hello
World
23
$ diff --unchanged-group-format='@@ %dn,%df
%<' --old-group-format='' --new-group-format='' \
  --changed-group-format='' a.txt b.txt
@@ 2,3
Hello
World
24
27.01.2020, 19:42
  • 1
    Можно постараться не встраивать литеральную новую строку как это: ...%df'$'\n''%<'... –  Paused until further notice. 24.08.2010, 05:54
  • 2
    Можно также сделать это как это: ... --unchanged-group-format="@@ %dn,%df%c'\012'%<" ... (Отметьте двойные кавычки.) –  Paused until further notice. 24.08.2010, 06:12
  • 3
    Большой материал! Я не знал эти опции, потому что я просто посмотрел на различную страницу справочника... –  maxschlepzig 24.08.2010, 21:17
  • 4
    я использую разность - разность версии (GNU diffutils) 2.8.1 И я получаю следующую ошибку: разность: конфликтующая выходная разность параметров стиля: Попробуйте 'разность - справка' для получения дополнительной информации. –  Sujay 21.04.2014, 15:09
  • 5
    я получал "ошибку: разность: конфликтующая выходная разность параметров стиля", потому что мне определили различный псевдоним. Использовать which diff видеть, является ли это Вашей проблемой. –  justinjhendrick 28.02.2017, 05:08
grep -Fxf file1 file2

-F средства соответствуют простым строкам (не regexps), -x средства только соответствия целой строки, -f средства берут 'шаблоны' (т.е. строки) из файла, названного как его аргумент

15
27.01.2020, 19:42
  • 1
    Не -f и -F обмененный?. По крайней мере, в моем grep версия похожа на это. Я должен обеспечить file2 вход к -f аргумент, как cat file1 | grep -Fxf file2, и затем работы. датчики –  Birei 15.12.2012, 22:01

comm может использоваться. man comm для всех опций, но Вы захотите использовать comm -12 ... показать только строки, которые существуют в обоих исходных данных.

Как люди указали, необходимо передать вход через sort сначала.

7
27.01.2020, 19:42
  • 1
    Гм, это работает только на общие строки, которые являются в том же номере строки в обоих файлах. коммуникация –  maxschlepzig 23.08.2010, 18:02
  • 2
    , кажется, для отсортированных файлов только а не дает тот полезный вывод для варианта использования OP. Его пример: коммуникация $-12 b Привет Мировая коммуникация: файл 1 не находится в отсортированной коммуникации порядка: файл 2 не находится в отсортированном порядке –  Marcel Stimberg 23.08.2010, 18:04
  • 3
    @maxschlepzig: необходимо отсортировать файлы прежде, чем передать их коммуникации –  Hemant 23.08.2010, 18:05
  • 4
    Путем сортировки Вас избавляются от всей информации о положении общих строк, все же. Вы не отсортировали бы файлы прежде, чем сравнить их с разностью, также. –  Marcel Stimberg 23.08.2010, 18:17

Я не думаю, что существует единственная команда, которая делает то, что Вы хотите, чтобы она сделала. Можно попытаться объединить вывод diff с grep,все же. Если Ваши текстовые файлы не содержат ни один из символов |,<,>, следующее дает Вам несколько полезный вывод:

$ diff --side-by-side a b | grep -n -v "[|<>]"
3:Hello                             Hello
4:World                             World
7
27.01.2020, 19:42
  • 1
    Попробуйте это: diff --width=155 --left-column --side-by-side a b | grep -n -v '|' | sed 's/ *($//' –  Paused until further notice. 24.08.2010, 05:48
  • 2
    , который выглядит лучше - но необходимо включать <и> в grep, который будет также избавлен от добавленных строк в любом файле. –  Marcel Stimberg 24.08.2010, 10:46

Dick Grune записал семейство инструментов для такого рода вещи:

http://dickgrune.com/Programs/similarity_tester/

Существуют версии, которые анализируют синтаксис различных языков, так, чтобы вещи как переименованные переменные могли рассматриваться как неизменные.

Это упаковывается как similarity-tester в Debian и Ubuntu.

2
27.01.2020, 19:42

Теги

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