Как сравнить два файла со сценарием оболочки?

10

Учитывая два файла, я хочу написать скрипт оболочки, который читает каждую строку из файла file1 и проверяет, есть ли он в файле file2. Если строка не найдена, она должна вывести два разных файла и выйти. Файлы могут содержать слова чисел или что-нибудь. Например :

файл1:

Hi!
1234
5678
1111
hello

file2:

1111
5678
1234
Hi!
hello

В этом случае два файла должны быть равны. если file2 имеет "привет !!!" вместо «привет» файлы отличаются. Я использую скрипт bash. Как я могу это сделать. Это не важно, что мне нужно делать это во вложенном цикле, но это то, что я думал, это единственный способ. Спасибо за вашу помощь.

0x0
источник

Ответы:

9

В Баш:

diff --brief <(sort file1) <(sort file2)
Игнасио Васкес-Абрамс
источник
Что делать, если файл является файлом CSV. будет ли сортировка работать?
0x0
sortне заботится о точном содержании, если вы не скажете это.
Игнасио Васкес-Абрамс
Можно ли найти, какие строки отличаются?
0x0
Удалить --briefи добавить параметры формата, например -u.
Игнасио Васкес-Абрамс
10

diffустанавливает состояние выхода, чтобы указать, являются ли файлы одинаковыми или нет. Статус выхода доступен в специальной переменной $?. Вы можете расширить ответ Игнасио следующим образом:

diff --brief <(sort file1) <(sort file2) >/dev/null
comp_value=$?

if [ $comp_value -eq 1 ]
then
    echo "do something because they're different"
else
    echo "do something because they're identical"
fi
Даг Харрис
источник
3
Вы можете просто обойтись if diff ... >/dev/nullбез скобок и переменных.
Приостановлено до дальнейшего уведомления.
1

Добавление этого, потому что я думаю, что [[]] && || конструкция довольно аккуратна:

#!/bin/bash

[[ `diff ${HOME}/file1 ${HOME}/file2` ]] &&  
   (echo "files different") ||
   (echo "files same")
mmrtnt
источник
1

Также должно работать:

comm -3 file1 file2

Я думаю, что символов достаточно для ответа ...

mpez0
источник
1

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

https://linux.die.net/man/1/cmp

Из-за этого у него есть дополнительный бонус - возможность сравнивать двоичные файлы.

if cmp -s "file1" "file2"
then
   echo "The files match"
else
   echo "The files are different"
fi

Я уверен, что это быстрее, чем использовать, diffхотя я лично не проверял это.

Ричард
источник
Разве дело "файлы разные" не пойдет первым? Тест if спрашивает, верно ли что-то, т. Е. Ненулевой код возврата. Если файлы совпадают, cmp возвращает 0 (для man-страницы), и это должно быть во втором случае.
user8162
@ user8162 То, что вы говорите, имеет смысл, однако я только что проверил это, и это правильный путь. Я не уверен, почему это так, если честно.
Ричард