第一次差异后差异停止

TTT*_*TTT 5 linux diff comparison

我想diff对 2 个文件执行 a并让它在第一个差异处停止。diff当然,我不要求通过 完成命令,但我确实要求在找到并报告第一个差异后停止实际命令。我对一些运行非常大的文件,并期待一个完美的比赛,但还是想知道有什么不同,应该在一发现,所以diff -qdiff ... |head -1cmp是没有好处的。而且,由于文件非常大,所以不会耗尽内存的东西会很好。虽然对于我当前的问题不是必需的,但是对于第一个(用户指定的)n 个差异的解决方案以及可以忽略空格差异的解决方案的加分。

kos*_*kos 5

cmp 在第一个差异处停止:

% cat foo
foo
bar
baz
---
foo
bar
baz
% cat bar
foo
bar
baz
---
foo+
bar+
baz+
% cmp foo bar
foo bar differ: byte 20, line 5
% 
Run Code Online (Sandbox Code Playgroud)

您可以围绕它包装一个脚本以打印不同的行:

#! /bin/bash
line=$(cmp "$1" "$2" | awk '{print $NF}')
if [ ! -z $line ]; then
    awk -v file="$1" -v line=$line 'NR==line{print "In file "file": "$0; exit}' "$1"
    awk -v file="$2" -v line=$line 'NR==line{print "In file "file": "$0; exit}' "$2"
 fi
Run Code Online (Sandbox Code Playgroud)
% ./script.sh foo bar
In file foo: foo
In file bar: foo+
Run Code Online (Sandbox Code Playgroud)

部分成本现在转移到 AWK 命令,但它应该比完全检查两个文件快得多。