Як я порівнюю два файли зі скриптом оболонки?


10

Враховуючи два файли, я хочу написати скрипт оболонки, який читає кожен рядок з file1 і перевіряє, чи є він у file2. Якщо рядок не знайдено, він повинен вивести два файли, які є різними та вийти. Файли можуть містити цифри слів або що завгодно. Наприклад :

file1:

Hi!
1234
5678
1111
hello

file2:

1111
5678
1234
Hi!
hello

У цьому випадку два файли повинні бути рівними. якщо у file2 є "привіт !!!" замість "привіт", то файли відрізняються. Я використовую скрипт bash. Як я можу це зробити. Не важливо, що мені потрібно це робити вкладеним циклом, але це те, що я думав, це єдиний спосіб. Спасибі за вашу допомогу.

Відповіді:


9

В bash:

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")

1

Також повинні працювати:

comm -3 file1 file2

Я думаю, що цього достатньо символів для відповіді ...


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 (на вкладку), і так, це має бути другий випадок.
user8162

@ user8162 Те, що ви говорите, має сенс, проте я лише перевірив це, і це правильний шлях. Я не впевнений, чому це так, якщо чесно.
Річард
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.