2つのファイルを比較し、違いを出力する

2つのファイルを比較し、違いを出力する

ループについては認識しておりdiff、使用していますが、diff では必要なものを実際に取得できないようです。基本的には、2 つのファイル (file2.txt と file2.txt) を比較し、それらの間で不足しているものの出力を取得したいと考えています。

目的 1: file1.txt から file2.txt に欠けているものを見つける

目的 2: いずれかのファイルで何が欠けているかを見つけます。file1.txt にはない行が file2.txt に存在する可能性があります。それらについても知りたいです。

diff行ごとに違いを比較して、2 つのファイルが同じではないことだけを知らせてくれます。必要なのは、ファイルを調べて行を区別しないプログラムです。file1.txt の 2 行目に '/bin/mount' を含む行があり、file2.txt の 59 行目に見つかった場合、それについて知る必要はありません。全体として何が欠けているかを知りたいだけです。これはできますか?

答え1

行の順序を気にしない場合は、まずファイルを並べ替えます。どのファイルにどの行が欠落しているかを確認するには、commの代わりにを使用しますdiff

comm <(sort file1) <(sort file2)

答え2

目的 1: file1.txt から file2.txt に欠けているものを見つける

grep

grep -xvFf file2.txt file1.txt

comm

comm -13 <(sort file1.txt) <(sort file2.txt)

およびsortuniq:

sort file2.txt file2.txt file1.txt | uniq -u

目標 2: いずれかのファイルで何が欠けているかを見つけます。file1.txt にはない行が file2.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'

およびsortuniq:

sort file1.txt file2.txt | uniq -u

答え3

2つのファイル間の類似度を一致させる簡単なコードです

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」の 2 つのファイルを作成します。

関連情報