у різних звітах два файли відрізняються, хоча вони однакові!


31

У мене є два файли, які мені схожі (включаючи пробіли пробілів та нові рядки), але розмін все ще говорить, що вони відрізняються. Навіть коли я роблю diff -yпоруч порівняння, лінії виглядають абсолютно однаково. Вихід з diff - цілі 2 файли.

Будь-яка ідея, що це викликає?


3
Спробуйте порівняти недруковані символи. Найпростіший спосіб їх перегляду - це sed -n l filename. Якщо це не допоможе, додайте diffсюди приклад даних та виведіть сюди.
пік

1
Ага, дякую, рядки у файлі закінчуються на $, а в іншому закінчуються на $ r
MinaHany

1
Швидке виправлення полягає у використанні dos2unix для обох файлів (або того, кого ви підозрюєте, що з машини Windows).
chembrad

В якості доповнення до існуючих відповідей: fileкоманда натякнути вам про зміст файлу, в тому числі таких речей , як ASCII text, with CRLF line terminatorsпроти ASCII text.
Стефан Гурішон

Відповіді:


29

Дивно .. ви можете спробувати cmp? Ви також можете скористатися параметром " -b".

cmp man page - Порівняйте два файли байт за байтом.

Це одна з приємних речей про Unix / Linux .. так багато інструментів :)


2
Дякую за це! Я отримав: байт 19, рядок 1 - 15 ^ M 12 ^ J що це означає?
MinaHany


2
спробував -b з diff і, здається, працює для мене. Сторінка man каже -b, що для ignore changes in the amount of white space.
rahul.deshmukhpatil

17

Чи можуть бути різниці, спричинені закінченнями рядків DOS проти UNIX чи чимось подібним?

Що робити, якщо ви hexdumpїх? Це може виявити відмінності більш очевидно, наприклад:

hexdump -C file1 > file1.hex
hexdump -C file2 > file2.hex
diff file1.hex file2.hex

Ну, два шестикутники різні. кожен раз, коли у файлі є 0d 0a, у другого просто 0a
MinaHany

3
В одному ви маєте закінчення рядків DOS (CRLF), а в іншому закінчення рядків UNIX (LF). Ось чому вони виглядають по-різному, але не тоді, коли ви дивитесь на них візуально. Подивіться en.wikipedia.org/wiki/Newline#Conversion_utilities
mrb

Зрозумів! Дуже дякую. Пропозиція Левона про використання cmp чіткіше показує різницю :)
MinaHany

17

Спробуйте:

diff file1 file2 | cat -t

Цей -tпараметр призведе catдо чіткого відображення будь-яких спеціальних символів - наприклад. ^Mдля CR, ^Iдля табл.

На головній сторінці (OS X):

 -t      Display non-printing characters (see the -v option), and display tab characters as `^I'.

 -v      Display non-printing characters so they are visible.
         Control characters print as `^X' for control-X; the delete character
         (octal 0177) prints as `^?'.  Non-ASCII characters
         (with the high bit set) are printed as `M-' (for meta) followed by the
         character for the low 7 bits.

4

Моя перша здогадка, яка виявляється підтвердженою, - це те, що файли використовують різні закінчення рядків. Це може бути якась інша різниця у просторі пробілів, наприклад, наявність пробілу пробілу (але ти зазвичай цього не отримаєш у багатьох рядках) або різного відступу (вкладки проти пробілів). Використовуйте команду, яка друкує пробіли та керує символами у видимій формі, наприклад

diff <(cat -A file1) <(cat -A file2)
diff <(sed -n l file1) <(sed -n l file2)

Ви можете підтвердити, що відмінності стосуються лише закінчень рядків, попередньо їх нормалізуючи. Ви можете мати dos2unixутиліту; якщо ні, то видаліть зайвий символ CR (^ M, \ r, \ 015):

diff <(tr -d '\r' <file1) <(tr -d '\r' <file2)

або, якщо file1це одна з закінченнями DOS

 tr -d '\r' <file1 | diff - file2
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.