Назад | Перейти на главную страницу

diff дает все разные, но человеческое сравнение показывает равенства

У меня есть 2 файла:

2       m1.small
1       m3.large
2       m3.medium
2       t1.micro
1       t2.large
7       t2.medium
4       t2.micro
7       t2.small

и б:

1       c4.2xlarge
1       c4.large
2       m1.small
1       m3.large
3       m3.medium
1       m4.large
3       t1.micro
3       t2.large
11      t2.medium
7       t2.micro
7       t2.small

Когда я использую sdiff, я получаю совсем другое:

$ sdiff a b
2       m1.small           | 1       c4.2xlarge
1       m3.large           | 1       c4.large
2       m3.medium          | 2       m1.small
2       t1.micro           | 1       m3.large
1       t2.large           | 3       m3.medium
7       t2.medium          | 1       m4.large
4       t2.micro           | 3       t1.micro
7       t2.small           | 3       t2.large
                           > 11      t2.medium
                           > 7       t2.micro
                           > 7       t2.small

В то время как я ясно вижу совпадение по крайней мере

2       m1.small
1       m3.large
7       t2.small

Почему это так, и могу ли я что-нибудь сделать для оптимизации результата, получаемого от diff.

Я также пробовал использовать meld (инструмент Windows diff), и это дает мне точно такой же результат.

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

Утилита comm может быть тем, что вы ищете, однако файлы потребуют некоторой предварительной обработки (порядок полей и сортировка):

cat a | awk '{ print $2 " " $1}' | sort > as
cat b | awk '{ print $2 " " $1}' | sort > bs

а затем вы можете выполнить comm:

comm as bs

который дает вывод в 3 столбцах (присутствует в левом поле, в правом поле или в обоих):

        c4.2xlarge 1
        c4.large 1
                m1.small 2
                m3.large 1
m3.medium 2
        m3.medium 3
        m4.large 1
t1.micro 2
        t1.micro 3
t2.large 1
        t2.large 3
        t2.medium 11
t2.medium 7
t2.micro 4
        t2.micro 7
                t2.small 7

Также возможно выдавать только строки, встречающиеся только в левом файле (comm -2 -3) или правильный файл (comm -1 -3) и т.д.

Я думаю, что это максимально близко к результату, который вы можете получить.


На самом деле этот вопрос выглядит примерно так же, как https://stackoverflow.com/questions/373810/unix-command-to-find-lines-common-in-two-files

Альтернативное решение comm можно найти там, чтобы просто определить общие строки, используя awk. Я воспроизвожу его здесь, потому что он очень элегантен:

awk 'NR==FNR{arr[$0];next} $0 in arr' a b