9

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

файл1:

Hi!
1234
5678
1111
hello

file2:

1111
5678
1234
Hi!
hello

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

5 ответов5

9

В Баш:

diff --brief <(sort file1) <(sort file2)
8

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
1

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

comm -3 file1 file2

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

1

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

#!/bin/bash

[[ `diff ${HOME}/file1 ${HOME}/file2` ]] &&  
   (echo "files different") ||
   (echo "files same")
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 хотя я лично не проверял это.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .