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

ntjbwcob  于 2023-06-22  发布在  Unix
关注(0)|答案(5)|浏览(196)

我的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一行程序来处理这个更原始的diff输出的输出?(请注意,我无法在这个solaris盒子上安装更新的diff版本)。
谢谢!

omqzjyyz

omqzjyyz1#

使用GNU差异。
http://www.gnu.org/software/diffutils/
您可以构建并安装到您的本地目录,不是吗?如果你有一个主目录、一个编译器和一个make,你可以构建你自己的GNU diff。
我没有Solaris,但我无法想象它会比这更多:

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

无需root权限。

xggvc2p6

xggvc2p62#

comm -3几乎可以实现您想要的功能,但需要排序的输入。它还将按照字母顺序将它们放在单独的行中。您的示例(排序后)将显示为

five
      five5
two
      two2

如果solaris diff不能满足你的要求,那么标准solaris机器上的任何东西也不能满足你的要求,这意味着要从其他地方引入代码,不管是你自己的还是别人的。正如GNU diff所做的那样,你可以使用它。

bmp9r5qi

bmp9r5qi3#

示例输出:

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

遗憾的是,它目前无法处理几个相同的配置变量...它计数它们,并将认为文件不同。

nx7onnlm

nx7onnlm4#

上面和下面给出的所有答案都是完美的,但是仅仅输入一个命令并得到一个结果并不能帮助你在将来解决类似的问题。
这里有一个链接解释了diff是如何工作的。一旦你通过了这个链接,你就可以自己解决问题了
这里有一个链接。https://www.youtube.com/watch?v=5_dyVrvbWjc

cuxqih21

cuxqih215#

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

相关问题