我的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盒上安装更新的差异版本。)
谢谢!
答案 0 :(得分:2)
使用GNU diff。
http://www.gnu.org/software/diffutils/
您可以构建并将其安装到本地目录中,不是吗?如果你有一个主目录,一个编译器和一个make,你可以构建自己的GNU diff。
我没有Solaris,但我无法想象它会比这更多:
./configure --prefix=/home/bob
make
make install
无需root权限。
答案 1 :(得分:2)
上面和下面给出的所有答案都很完美,但只是输入一个命令并获得结果将不会帮助你解决类似的问题。
这里有一个解释差异如何工作的链接。一旦你通过链接,你可以自己解决问题
答案 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