假设我有一个名为 checkDuplicateDownload.sh 的文件,通过比较新文件和旧文件来检查下载的文件是否重复。
这就是我所做的。
duplicate=`cmp $prevFile newFile -b`
其中duplicate
是存储结果的变量cmp
,prevFile
是前一个文件,newFile
是新文件。如果文件相同,则duplicate
值为 0,否则为 1。
如何执行与cmp
上述命令相同的操作,但使用 awk 并将比较结果存储到duplicate
变量中?
答案1
在我看来,您所描述的是两个文件的无声比较。第一个代码片段会将退出状态放入cmp
变量中duplicate
(0=匹配,否则出现问题;请参阅man cmp
退出状态值的详细信息)
cmp -s prevFile newFile
duplicate=$?
但我怀疑您接下来要做的是测试其价值$duplicate
并对其执行操作。在这种情况下,您不妨直接测试退出cmp
值
if cmp -s prevFile newFile
then
echo "Files match"
else
echo "Files do not match (or one is missing, unreadable, etc.)"
fi
如果您打算使用变量,请不要忘记在使用它们时用双引号括起来,即
cmp -s "$prevFile" "$newFile"
还要考虑是否有可能$prevFile
尚不存在
最后,怎么样awk
?它不是适合这项工作的工具,所以不要在这里使用它。
答案2
你可以用awk
这个。这样做没有多大意义。有一些专门为文件比较而设计的工具(diff
、cmp
等md5sum
)。另一方面,awk
它是一种功能强大的脚本语言,可用于任意任务。因此,您确实可以在 中重新实现这些工具的现有功能awk
,但除了以较慢、效率较低的方式完成这些其他工具做得更好的工作之外,您不会从中获得任何好处。
例如,该awk
程序会告诉您两个文件是否相同或不同:
$ cat comp.awk
#!/usr/bin/awk -f
BEGIN{
differ=0
}
NR==FNR{
a[FNR]=$0;
last=FNR;
next
}
{
if(FNR>last || "x"$0"x" != "x"a[FNR]"x" ){
differ=1
exit;
}
}
END{
if(FNR<last){
differ=1
}
print differ
}
所以你可以用它来将比较存储在变量中:
duplicate=$(comp.awk prevFile newFile)
变量将是0
文件是否相同或1
不同。但您可以使用现有工具更快、更高效且可能更可靠地执行相同操作:
duplicate=$(diff -q prevFile newFile)
当然,该值不会是简单的1
or 0
,它将是 orFiles prevFile and newFile differ
或 一个空字符串,但这没有实际区别。据推测,您希望在后续测试操作中使用该变量,并且您可以完美地做到这一点:
$ [[ -z $duplicate ]] && echo differ || echo same
differ
因此,对已经存在的东西重新发明一个更慢、更容易出错、更麻烦的版本似乎毫无意义。