unix - команда diff для вывода в формате одной строки на разность - PullRequest
0 голосов
/ 09 ноября 2010

Версия diff в моем cygwin имеет ряд расширенных опций, которые позволяют мне распечатывать одно различие на строку.

Для двух файлов: one.txt и two.txt.

one.txt:

one
two
three
four
five
six

two.txt

one
two2
three
four
five5
six

И запуск diff в cygwin со следующими параметрами / параметрами:

diff -y --suppress-common-lines one.txt two.txt

Дает вывод:

two   |two2
five  |five5

Это тип формата, который мне нужен, когда в каждой строке выводится одно различие.На моем устройстве dev solaris опция "-y" не поддерживается, поэтому я застрял с выводом, который выглядит следующим образом:

2c2
< two
---
> two2
5c5
< five
---
> five5

Кто-нибудь знает, как я могу получить вывододно различие в строке на этой коробке Solaris?Может быть, используя sed / awk one liner для массажа вывода из этого более примитивного вывода diff?(Обратите внимание, я не могу установить более новую версию diff на эту коробку Solaris).

Спасибо!

Ответы [ 5 ]

2 голосов
/ 17 января 2015

Все ответы, приведенные выше и ниже, безупречны, но простой ввод команды и получение результата не помогут вам в решении подобных проблем в будущем.

Здесь ссылка, которая объясняет, как работает diff.Как только вы перейдете по ссылке, вы можете решить проблему самостоятельно

Вот ссылка.https://www.youtube.com/watch?v=5_dyVrvbWjc

2 голосов
/ 09 ноября 2010

Используйте GNU diff.

http://www.gnu.org/software/diffutils/

Вы можете собрать и установить его в свой локальный каталог, нет?Если у вас есть домашний каталог, компилятор и make, вы можете создать свой собственный diff для GNU.

У меня нет Solaris, но я не могу представить, что это будет намного больше, чем это:

./configure --prefix=/home/bob
make
make install

Привилегии root не требуются.

1 голос
/ 08 марта 2016

Пример вывода:

# ~/config_diff.sh postfix_DIST/master.cf postfix/master.cf
postfix_DIST/master.cf: -o smtpd_tls_security_level=encrypt -o smtpd_sasl_auth_enable=yes -o smtpd_client_restrictions=permit_sasl_authenticated,reject -o smtpd_tls_wrappermode=yes -o smtp_fallback_relay=
postfix/master.cf: -o cleanup_service_name=cleanup_sasl -o smtpd_tls_security_level=encrypt -o smtpd_sasl_auth_enable=yes -o smtpd_client_restrictions=permit_sasl_authenticated,reject -o cleanup_service_name=cleanup_sasl -o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes -o smtpd_client_restrictions=permit_sasl_authenticated,reject -o smtp_fallback_relay=

postfix_DIST/master.cf:smtp inet n - - - - smtpd smtp unix - - - - - smtp
postfix/master.cf:smtp inet n - - - - smtpd smtp unix - - - - - smtp

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

1 голос
/ 10 ноября 2010

comm -3 почти делает то, что вы хотите, но требует отсортированного ввода. Это также поместит их в отдельные строки в алфавитном порядке. Ваш пример (после сортировки) будет отображаться как

five
      five5
two
      two2

Если солярис diff не будет делать то, что вы хотите, то ничего на стандартной коробке Solaris не может этого сделать, что означает ввод кода из другого места, вашего или чужого. Поскольку GNU diff делает то, что вы хотите, просто используйте это.

0 голосов
/ 08 марта 2016
#! /bin/bash

FILES="$@"

COLUMN=1

for variable in $( awk -F: '{print $X}' X=${COLUMN} ${FILES} | sort -u ) ; do
        NUM_CONFIGS=$( for file in ${FILES} ; do
                grep "^${variable}" ${file}
        done | sort -u | wc -l )
        if [ "${NUM_CONFIGS}" -ne 1 ] ; then
                for file in ${FILES} ; do
                        echo ${file}:$( grep "^${variable}" ${file} )
                done
                echo
        fi
done
...