shell脚本比较两个文件并将差异写入第三个文件

时间:2016-05-12 13:02:55

标签: linux shell

我想比较两个文件并将两个文件之间的差异重定向到第三个文件 文件1:

  /opt/a/a.sql
  /opt/b/b.sql
  /opt/c/c.sql

如果任何文件在#之前有/opt/c/c.sql,则应跳过#

file2的:

 /opt/c/c.sql
 /opt/a/a.sql

我希望得到两个文件之间的区别。在这种情况下,/opt/b/b.sql应存储在不同的文件中。任何人都可以帮助我实现上述场景吗?

2 个答案:

答案 0 :(得分:1)

<强>文件1

$ cat file1 #both file1 and file2 may contain spaces which are ignored

/opt/a/a.sql
/opt/b/b.sql

/opt/c/c.sql
/opt/h/m.sql

<强> file2的

$ cat file2
/opt/c/c.sql
/opt/a/a.sql

<强>不要

awk 'NR==FNR{line[$1];next} 
     {if(!($1 in line)){if($0!=""){print}}}
    ' file2 file1 > file3

<强> file3的

$ cat file3
/opt/b/b.sql
/opt/h/m.sql

备注:

  1. 传递给awk的文件顺序非常重要,请将文件传递给检查 - file2此处 - 首先是主文件 - file1

  2. 检查awk documentation以了解此处的操作。

答案 1 :(得分:1)

您可以使用catsedsortuniq等工具。

主要观察结果是:如果该行在两个文件中,则cat file1 file2中的不唯一

此外,在cat file1 file2| sort中,所有双打都按顺序排列。使用uniq -u我们得到唯一的行并拥有此管道:

cat file1 file2 | sort | uniq -u 

使用sed删除前导空格,空白和注释行,我们得到最后一个管道:

cat file1 file2 | sed -r 's/^[ \t]+//; /^#/ d; /^$/ d;' | sort | uniq -u > file3