我想比较两个文件并将两个文件之间的差异重定向到第三个文件 文件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
应存储在不同的文件中。任何人都可以帮助我实现上述场景吗?
答案 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
备注:强>
传递给awk的文件顺序非常重要,请将文件传递给检查 - file2
此处 - 首先是主文件 - file1
。
检查awk
documentation以了解此处的操作。
答案 1 :(得分:1)
您可以使用cat
,sed
,sort
和uniq
等工具。
主要观察结果是:如果该行在两个文件中,则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