【问题标题】:Compare two text files line by line, finding differences but ignoring numerical values differences逐行比较两个文本文件,发现差异但忽略数值差异
【发布时间】:2022-10-17 05:42:34
【问题描述】:

我正在编写一个 bash 脚本来逐行比较两个相似的文本文件并找到文件的每一行之间的最终差异,我应该指出差异并告诉差异在哪一行,但我应该忽略数值在这个比较中。

例子:

Process is running; process found : 12603 process is listening on port 1200
Process is running; process found : 43023 process is listening on port 1200

在上面的示例中,脚本不应该发现任何差异,因为它只是进程 ID,并且它一直在变化。

但除此之外,我希望它通知我行之间的差异。

例子:

Process is running; process found : 12603 process is listening on port 1200
Process is not running; process found : 43023 process is not listening on port 1200

我已经有一个工作脚本来查找差异,并且我使用以下函数来查找差异并忽略数值,但它不能完美地工作,有什么建议吗?

    COMPARE_FILES()
{
    awk 'NR==FNR{a[FNR]=$0;next}$0!~a[FNR]{print $0}' $1 $2
}

其中$1$2 是要比较的两个文件。

【问题讨论】:

  • 如果一行包含foo77bar baz 而另一行包含foo78bar baz,假设的结果是什么?它们被认为是相同的还是不同的?
  • 它工作不完美: 这意味着它几乎可以工作了。因此,您应该发布一个具体案例,其中您的算法产生的结果与您的预期不同。

标签: bash awk


【解决方案1】:

请您尝试以下方法:

COMPARE_FILES() {
    awk '
    NR==FNR {a[FNR]=$0; next}
    {
        b=$0; gsub(/[0-9]+/,"",b)
        c=a[FNR]; gsub(/[0-9]+/,"",c)
        if (b != c) {printf "< %s
> %s
", $0, a[FNR]}
    }' "$1" "$2"
}

【讨论】:

  • 感谢您的及时反馈。如果您认为我的回答很好地解决了您的问题,如果您可以通过单击答案旁边的复选标记接受它,我将不胜感激。 BR。
【解决方案2】:

有什么建议么 ?

在进行比较之前抛弃数字,我会按照替换方式改进您的代码

NR==FNR{a[FNR]=$0;next}$0!~a[FNR]{print $0}

使用

NR==FNR{a[FNR]=$0;next}gensub(/[[:digit:]]/,"","g",$0)!~gensub(/[[:digit:]]/,"","g",a[FNR]){print $0}

说明:我利用gensub string function,因为它确实返回了新字符串(gsub 更改选定的变量值)。我使用空字符串替换[:digit:] 字符(即删除它)globally。

【讨论】:

    【解决方案3】:

    使用任何 awk:

    compare_files() {
        awk '{key=$0; gsub(/[0-9]+(.[0-9]+)?/,0,key)} NR==FNR{a[FNR]=key; next} key!~a[FNR]' "${@}"
    }
    

    以上不只是删除数字,它会替换每组数字,无论它们是像17 这样的整数还是像17.31 这样的小数,用数字0 来避免错误匹配。

    例如,给定输入如下:

    file1: foo 1234 bar
    file2: foo bar
    

    如果您只是删除数字,那么这两行错误地变得相同:

    file1: foo bar
    file2: foo bar
    

    而如果您用0 替换所有数字,那么它们正确地保持不同:

    file1: foo 0 bar
    file2: foo bar
    

    请注意,尽管我们在将数字转换为 0 后比较行,但我们并没有修改原始行,因此输出将显示原始行,而不是修改后的行,以便于进一步研究差异。

    【讨论】:

      猜你喜欢
      • 2017-04-06
      • 1970-01-01
      • 1970-01-01
      • 2012-02-18
      • 2014-06-08
      • 1970-01-01
      • 1970-01-01
      • 2011-05-31
      • 2017-12-11
      相关资源
      最近更新 更多