如何使用Shell脚本比较两个文件?


10

给定两个文件,我想编写一个shell脚本,该脚本从file1中读取每一行,并检查它是否在file2中。如果找不到一行,则应输出两个不同的文件并退出。这些文件可以包含单词数字或任何其他内容。例如 :

文件1:

Hi!
1234
5678
1111
hello

文件2:

1111
5678
1234
Hi!
hello

在这种情况下,两个文件应该相等。如果file2具有“ hello !!!” 而不是“ hello”,则文件是不同的。我正在使用bash脚本。我怎样才能做到这一点。我不需要嵌套循环来执行此操作并不重要,但这是我认为的唯一方法。谢谢你的帮助。

Answers:



10

diff设置其退出状态以指示文件是否相同。退出状态可通过特殊变量访问$?。您可以通过以下方式扩展Ignacio的答案:

diff --brief <(sort file1) <(sort file2) >/dev/null
comp_value=$?

if [ $comp_value -eq 1 ]
then
    echo "do something because they're different"
else
    echo "do something because they're identical"
fi

3
您可以if diff ... >/dev/null不用括号和变量。
暂停,直到另行通知。

1

添加此内容是因为我认为[[]] && || 构造非常整洁:

#!/bin/bash

[[ `diff ${HOME}/file1 ${HOME}/file2` ]] &&  
   (echo "files different") ||
   (echo "files same")

1

也应该工作:

comm -3 file1 file2

我认为这足以回答问题...


1

虽然这diff是一个很好的答案,但我可能会cmp改用它专门用于对两个文件进行逐字节比较。

https://linux.die.net/man/1/cmp

因此,它具有比较二进制文件的额外好处。

if cmp -s "file1" "file2"
then
   echo "The files match"
else
   echo "The files are different"
fi

diff虽然我没有亲自测试过,但我认为它比使用更快。


难道“文件不一样”的情况会优先吗?if测试询问是否为真,即非零返回码。如果文件匹配,则cmp返回0(每个联机帮助页),因此应该是第二种情况。
user8162

@ user8162您说的是有道理的,但是我已经测试过了,这是正确的方法。老实说,我不确定为什么会这样。
理查德
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.