逐行比较两个文本文件,发现差异但忽略数值差异
Compare two text files line by line, finding differences but ignoring numerical values differences
我正在编写一个 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]=[=12=];next}[=12=]!~a[FNR]{print [=12=]}'
}
其中 $1 和 $2 是要比较的两个文件。
请您尝试以下操作:
COMPARE_FILES() {
awk '
NR==FNR {a[FNR]=[=10=]; next}
{
b=[=10=]; gsub(/[0-9]+/,"",b)
c=a[FNR]; gsub(/[0-9]+/,"",c)
if (b != c) {printf "< %s\n> %s\n", [=10=], a[FNR]}
}' "" ""
}
Any suggestions ?
在进行比较之前丢弃数字,我会按照替换的方式改进您的代码
NR==FNR{a[FNR]=[=10=];next}[=10=]!~a[FNR]{print [=10=]}
使用
NR==FNR{a[FNR]=[=11=];next}gensub(/[[:digit:]]/,"","g",[=11=])!~gensub(/[[:digit:]]/,"","g",a[FNR]){print [=11=]}
解释:我利用 gensub
string function 就像它对 return 新字符串(gsub
改变选定的变量值)一样。我用空字符串替换 [:digit:]
字符(即删除它) g
lobally.
使用任何 awk:
compare_files() {
awk '{key=[=10=]; gsub(/[0-9]+(.[0-9]+)?/,RS,key)} NR==FNR{a[FNR]=key; next} key!~a[FNR]' "${@}"
}
以上不只是删除数字,它用 RS
的内容替换了每组数字,无论它们是整数 17
还是小数 17.31
](默认为换行符)以避免错误匹配,例如:
file1: foo 1234 bar
file2: foo bar
如果您只是删除数字,那么这两行会错误地变得相同:
file1: foo bar
file2: foo bar
而如果您用换行符替换数字,则它们正确地保持不相同:
file1: foo
bar
file2: foo bar
我正在编写一个 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]=[=12=];next}[=12=]!~a[FNR]{print [=12=]}'
}
其中 $1 和 $2 是要比较的两个文件。
请您尝试以下操作:
COMPARE_FILES() {
awk '
NR==FNR {a[FNR]=[=10=]; next}
{
b=[=10=]; gsub(/[0-9]+/,"",b)
c=a[FNR]; gsub(/[0-9]+/,"",c)
if (b != c) {printf "< %s\n> %s\n", [=10=], a[FNR]}
}' "" ""
}
Any suggestions ?
在进行比较之前丢弃数字,我会按照替换的方式改进您的代码
NR==FNR{a[FNR]=[=10=];next}[=10=]!~a[FNR]{print [=10=]}
使用
NR==FNR{a[FNR]=[=11=];next}gensub(/[[:digit:]]/,"","g",[=11=])!~gensub(/[[:digit:]]/,"","g",a[FNR]){print [=11=]}
解释:我利用 gensub
string function 就像它对 return 新字符串(gsub
改变选定的变量值)一样。我用空字符串替换 [:digit:]
字符(即删除它) g
lobally.
使用任何 awk:
compare_files() {
awk '{key=[=10=]; gsub(/[0-9]+(.[0-9]+)?/,RS,key)} NR==FNR{a[FNR]=key; next} key!~a[FNR]' "${@}"
}
以上不只是删除数字,它用 RS
的内容替换了每组数字,无论它们是整数 17
还是小数 17.31
](默认为换行符)以避免错误匹配,例如:
file1: foo 1234 bar
file2: foo bar
如果您只是删除数字,那么这两行会错误地变得相同:
file1: foo bar
file2: foo bar
而如果您用换行符替换数字,则它们正确地保持不相同:
file1: foo
bar
file2: foo bar