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


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.