Как сравнить два файла

46

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

File_1.txt:

User1 US
User2 US
User3 US

File_2.txt:

User1 US
User2 US
User3 NG

output_file:

User3 has changed
    
задан Roboman1723 25.08.2014 в 16:58
источник

9 ответов

57

Посмотрите на команду diff . Это хороший инструмент, и вы можете прочитать все об этом, набрав man diff в ваш терминал.

Команда, которую вы хотите сделать, это diff File_1.txt File_2.txt , которая выведет разницу между ними и будет выглядеть примерно так:

Быстрая заметка при чтении вывода из третьей команды: «стрелки» ( < и > ) относятся к тому, что значение строки находится в левом файле ( < ) по сравнению с правильным файлом ( > ), причем левым файлом является тот, который вы ввели сначала в командной строке, в этом случае File_1.txt

Кроме того, вы можете заметить, что 4-я команда - это diff ... | tee Output_File , которая передает результаты из diff в tee , которая затем помещает этот вывод в файл, так что вы можете сохранить его позже, если вы этого не сделаете хотите просмотреть все это на консоли в эту секунду.

    
ответ дан Mitch 25.08.2014 в 17:03
источник
28

Или вы можете использовать Meld Diff

  

Meld помогает сравнивать файлы, каталоги и контролируемую версию   проекты. Он обеспечивает двух- и трехстороннее сравнение обоих файлов и   каталогов и поддерживает многие популярные системы управления версиями.

Установите с помощью:

sudo apt-get install meld

Ваш пример:

Сравнить каталог:

Пример с полным текстом:

    
ответ дан Achu 25.08.2014 в 17:57
9

Вы можете использовать vimdiff .

Пример:

vimdiff  file1  file2
    
ответ дан Mr. S 28.08.2014 в 07:14
7

Meld - действительно отличный инструмент. Но вы также можете использовать diffuse для визуального сравнения двух файлов:

diffuse file1.txt file2.txt

    
ответ дан Meysam 26.08.2014 в 08:54
7

Litteraly, придерживающийся вопроса (file1, file2, outputfile с сообщением «has changed»), скрипт ниже работает.

Скопируйте сценарий в пустой файл, сохраните его как compare.py , сделайте его исполняемым, запустите его командой:

/path/to/compare.py <file1> <file2> <outputfile>

Сценарий:

#!/usr/bin/env python

import sys
file1 = sys.argv[1]; file2 = sys.argv[2]; outfile = sys.argv[3]

def readfile(file):
    with open(file) as compare:
        return [item.replace("\n", "").split(" ") for item in compare.readlines()]

data1 = readfile(file1); data2 = readfile(file2)
mismatch = [item[0] for item in data1 if not item in data2]

with open(outfile, "wt") as out:
    for line in mismatch:
        out.write(line+" has changed"+"\n")

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

Для печати в файл:

/path/to/compare.py <file1> <file2> <outputfile>

Для печати в окне терминала:

/path/to/compare.py <file1> <file2> 

Сценарий:

#!/usr/bin/env python

import sys

file1 = sys.argv[1]; file2 = sys.argv[2]
try:
    outfile = sys.argv[3]
except IndexError:
    outfile = None

def readfile(file):
    with open(file) as compare:
        return [item.replace("\n", "").split(" ") for item in compare.readlines()]

data1 = readfile(file1); data2 = readfile(file2)
mismatch = [item[0] for item in data1 if not item in data2]

if outfile != None:
        with open(outfile, "wt") as out:
            for line in mismatch:
                out.write(line+" has changed"+"\n")
else:
    for line in mismatch:
        print line+" has changed"
    
ответ дан Jacob Vlijm 25.08.2014 в 20:34
6

FWIW, мне больше нравится то, что я получаю от бок о бок вывод из diff

diff -y -W 120 File_1.txt File_2.txt

даст что-то вроде:

User1 US                            User1 US
User2 US                            User2 US
User3 US                          | User3 NG
    
ответ дан Mike Reardon 22.05.2015 в 21:37
6

Вы можете использовать команду cmp :

cmp -b "File_1.txt" "File_2.txt"

будет

a b differ: byte 25, line 3 is 125 U 116 N
    
ответ дан Maythux 17.06.2015 в 12:58
3

Простым способом является использование colordiff , который ведет себя как diff , но раскрашивает свой результат. Это очень полезно для чтения diff. Используя ваш пример,

$ colordiff -u File_1.txt File_2.txt
--- File_1.txt  2016-12-24 17:59:17.409490554 -0500
+++ File_2.txt  2016-12-24 18:00:06.666719659 -0500
@@ -1,3 +1,3 @@
 User1 US
 User2 US
-User3 US
+User3 NG

, где параметр u дает унифицированный diff. Вот как выглядит раскрашенный diff:

Установите colordiff , запустив sudo apt-get install colordiff .

    
ответ дан edwinksl 25.12.2016 в 00:05
2

Дополнительный ответ

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

Рассмотрим сценарий ниже, где вы можете дать два файла в качестве аргументов, и файл скажет вам, являются ли они одинаковыми или нет.

#!/bin/bash

# Check if both files exist  
if ! [ -e ""  ];
then
    printf "%s doesn't exist\n" ""
    exit 2
elif ! [ -e "" ]
then
    printf "%s doesn't exist\n" ""
    exit 2
fi

# Get checksums of eithe file
file1_sha=$( sha256sum "" | awk '{print }')
file2_sha=$( sha256sum "" | awk '{print }')

# Compare the checksums
if [ "x$file1_sha" = "x$file2_sha" ]
then
    printf "Files %s and %s are the same\n" "" ""
    exit 0
else
    printf "Files %s and %s are different\n" "" ""
    exit 1
fi

Пример прогона:

$ ./compare_files.sh /etc/passwd ./passwd_copy.txt                                                                
Files /etc/passwd and ./passwd_copy.txt are the same
$ echo $?
0
$ ./compare_files.sh /etc/passwd /etc/default/grub                                                                
Files /etc/passwd and /etc/default/grub are different
$ echo $?
1

Более старый ответ

Кроме того, существует команда comm , которая сравнивает два отсортированных файла и дает результат в 3-х столбцах: столбец 1 для элементов, уникальных для файла # 1, столбец 2 для элементов, уникальных для файла # 2, и столбца 3 для элементов присутствует в обоих файлах.

Чтобы подавить любой столбец, вы можете использовать переключатели -1, -2 и -3. Использование -3 показывает линии, которые отличаются.

Ниже вы можете увидеть снимок экрана команды в действии.

Существует только одно требование - файлы должны быть отсортированы для их надлежащего сопоставления. Для этой цели может использоваться команда sort . Bellow - это еще один снимок экрана, где файлы сортируются, а затем сравниваются. Строки, начинающиеся с левого звонка только в File_1, строки, начинающиеся с столбца 2, принадлежат только File_2

    
ответ дан Sergiy Kolodyazhnyy 22.05.2015 в 21:51