Я хочу сравнить значения двух файлов, но не на основе позиции или последовательности

Предположим, что у меня есть два файла со следующим содержимым:

$ cat File1.txt
Apple
orange
watermelon
avocado
lime
$ cat File2.txt
orange
Apple
lime 
watermelon
avocado

В принципе, нет никакой разницы, так как оба имеют одинаковые значения. Я использую команду diff:

diff File1.txt File2.txt

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

5
25.06.2020, 22:05
3 ответа

Сравните отсортированные файлы.

В bash (или ksh или zsh )с заменой процесса :

diff <(sort File1.txt) <(sort File2.txt)

Однотонная:

sort File1.txt >File1.txt.sorted
sort File1.txt >File2.txt.sorted
diff File1.txt.sorted File2.txt.sorted

Чтобы быстро увидеть различия между отсортированными файлами,commможет быть полезно :он показывает непосредственно строки, которые есть в одном файле, но не в другом.

comm -12  <(sort File1.txt) <(sort File2.txt) >common-lines.txt
comm -23  <(sort File1.txt) <(sort File2.txt) >only-in-file-1.txt
comm -13  <(sort File1.txt) <(sort File2.txt) >only-in-file-2.txt

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

foo
bar
foo

идентично

bar
foo

затем удалите дубликаты при сортировке :используйте sort -uвместо sort.

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

LC_ALL=C sort File1.txt >File1.txt.sorted
14
18.03.2021, 23:24

Сначала отсортируйте файлы (вbash):

diff <(sort file1) <(sort file2)
5
18.03.2021, 23:24

Используя awk, вы можете создать хэш-индекс для каждого отдельного текста входной строки, используя такую ​​команду, как:

awk 'The magic' Q=A fileA Q=B fileB Q=C fileC...

'Магия' для каждой строки ввода:

{ X[$0] = X[$0] Q; }

Когда вы дойдете до условия END, вы переберете индекс X. Любая строка, встречающаяся ровно один раз в каждом файле, будет иметь вид:

X["Apple"] = "ABC";

Строка, которая появляется один раз в файле A и три раза в файле C, будет представлена ​​как «ACCC». Вы можете сообщать о любых аномалиях любым удобным для вас способом для любого количества файлов. (Однажды мне пришлось провести 14-кратное -сравнение критической для безопасности -системы, которая работала на основном и резервном серверах, каждый из которых имел -реальное время плюс базу данных Oracle.)

Если вы решите включить номер строки NR в каждый тег и написать несколько интересных шаблонов, вы можете сделать теги похожими на:

X["Walrus"] = "A347B38C90"

и сообщить, какие совпадающие тексты были в каких строках в различных файлах.

4
18.03.2021, 23:24

Теги

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