如何使用 awk 而不是 cmp 将比较结果存储到变量

如何使用 awk 而不是 cmp 将比较结果存储到变量

假设我有一个名为 checkDuplicateDownload.sh 的文件,通过比较新文件和旧文件来检查下载的文件是否重复。

这就是我所做的。

duplicate=`cmp $prevFile newFile -b`

其中duplicate是存储结果的变量cmpprevFile是前一个文件,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这个。这样做没有多大意义。有一些专门为文件比较而设计的工具(diffcmpmd5sum)。另一方面,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)

当然,该值不会是简单的1or 0,它将是 orFiles prevFile and newFile differ或 一个空字符串,但这没有实际区别。据推测,您希望在后续测试操作中使用该变量,并且您可以完美地做到这一点:

$ [[ -z $duplicate ]] && echo differ || echo same
differ

因此,对已经存在的东西重新发明一个更慢、更容易出错、更麻烦的版本似乎毫无意义。

相关内容