unix - diff命令以单行差分格式输出

时间:2010-11-09 03:59:30

标签: unix diff

我的cygwin中的diff版本有许多高级选项,允许我每行打印出一个差异。

给出两个文件one.txt和two.txt。

此时就把one.txt存盘:

one
two
three
four
five
six

two.txt

one
two2
three
four
five5
six

使用以下选项/参数在cygwin中运行diff:

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输出的输出? (请注意,我无法在此solaris盒上安装更新的差异版本。)

谢谢!

5 个答案:

答案 0 :(得分:2)

使用GNU diff。

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

您可以构建并将其安装到本地目录中,不是吗?如果你有一个主目录,一个编译器和一个make,你可以构建自己的GNU diff。

我没有Solaris,但我无法想象它会比这更多:

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

无需root权限。

答案 1 :(得分:2)

上面和下面给出的所有答案都很完美,但只是输入一个命令并获得结果将不会帮助你解决类似的问题。

这里有一个解释差异如何工作的链接。一旦你通过链接,你可以自己解决问题

这是一个链接。 https://www.youtube.com/watch?v=5_dyVrvbWjc

答案 2 :(得分:1)

comm -3几乎可以满足您的需求,但需要排序输入。它还将按字母顺序将它们分成不同的行。您的示例(一旦排序)将显示为

five
      five5
two
      two2

如果solaris diff不能达到您想要的效果,那么标准solaris盒上的任何东西都不会出现这种情况,这意味着从其他地方引入代码,无论是您自己还是其他人。由于GNU diff可以满足您的需求,只需使用它即可。

答案 3 :(得分:1)

示例输出:

# ~/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

可悲的是,它目前无法处理几个相同的配置变量......它会对它们进行计数并认为文件不同。

答案 4 :(得分:0)

#! /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