Я знаю о diff
циклах и использую их, но я просто не могу получить то, что мне нужно с помощью diff. Я в основном пытаюсь сравнить два файла (file2.txt и file2.txt) и просто получить вывод того, чего не хватает между ними.
Задача 1: Найти то, чего не хватает в file2.txt из file1.txt
Задача 2: Найти то, чего не хватает в каждом из файлов. Некоторые строки могут быть в file2.txt, но не в file1.txt. Я бы хотел узнать о них тоже.
diff
только говорит мне, что два файла не одинаковы, сравнивая построчно различия. Мне нужна программа, которая проходит по файлу и не различает по строкам. Если строка, содержащая '/bin/mount', находится на строке 2 файла file1.txt и находится на строке 59 файла file2.txt, то мне не нужно знать об этом. Я хочу только знать, чего там нет в целом. Можно ли это сделать?
решение1
Если вам не важен порядок строк, сначала отсортируйте файлы. Чтобы увидеть, какие строки отсутствуют в каком файле, используйте comm
вместо diff
:
comm <(sort file1) <(sort file2)
решение2
Задача 1: Найти то, чего не хватает в file2.txt из file1.txt
С grep
:
grep -xvFf file2.txt file1.txt
С comm
:
comm -13 <(sort file1.txt) <(sort file2.txt)
С sort
и uniq
:
sort file2.txt file2.txt file1.txt | uniq -u
Задача 2: Найти то, чего не хватает в каждом из файлов. Некоторые строки могут быть в file2.txt, но не в file1.txt. Я бы хотел узнать и о них.
С grep
:
grep -xvFf file1.txt file2.txt; grep -xvFf file2.txt file1.txt
С comm
:
comm -3 <(sort file1.txt) <(sort file2.txt) | tr -d '\t'
С sort
и uniq
:
sort file1.txt file2.txt | uniq -u
решение3
Вот простой код для сопоставления процента схожести между двумя файлами.
import numpy as np
def levenshtein(seq1, seq2):
size_x = len(seq1) + 1
size_y = len(seq2) + 1
matrix = np.zeros ((size_x, size_y))
for x in range(size_x):
matrix [x, 0] = x
for y in range(size_y):
matrix [0, y] = y
for x in range(1, size_x):
for y in range(1, size_y):
if seq1[x-1] == seq2[y-1]:
matrix [x,y] = min(
matrix[x-1, y] + 1,
matrix[x-1, y-1],
matrix[x, y-1] + 1
)
else:
matrix [x,y] = min(
matrix[x-1,y] + 1,
matrix[x-1,y-1] + 1,
matrix[x,y-1] + 1
)
#print (matrix)
return (matrix[size_x - 1, size_y - 1])
with open('original.txt', 'r') as file:
data = file.read().replace('\n', '')
str1=data.replace(' ', '')
with open('target.txt', 'r') as file:
data = file.read().replace('\n', '')
str2=data.replace(' ', '')
if(len(str1)>len(str2)):
length=len(str1)
else:
length=len(str2)
print(100-round((levenshtein(str1,str2)/length)*100,2),'% Similarity')
Создайте два файла «original.txt» и «target.txt» в одном каталоге с содержимым.