我正在撰寫一個 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 是要比較的兩個檔案。
uj5u.com熱心網友回復:
請您嘗試以下方法:
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\n> %s\n", $0, a[FNR]}
}' "$1" "$2"
}
uj5u.com熱心網友回復:
有什么建議么 ?
在進行比較之前 Jettison 數字,我會按照替換方式改進您的代碼
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字串函式,因為它確實回傳了新字串(gsub更改選定的變數值)。我[:digit:]用空字串替換字符(即洗掉它)g。
uj5u.com熱心網友回復:
使用任何 awk:
compare_files() {
awk '{key=$0; gsub(/[0-9] (.[0-9] )?/,RS,key)} NR==FNR{a[FNR]=key; next} key!~a[FNR]' "${@}"
}
上面不僅洗掉了數字,它還替換了每組數字,無論它們是整數17還是小數,都替換為(默認為換行符)17.31的內容,以避免錯誤匹配,例如:RS
file1: foo 1234 bar
file2: foo bar
如果您只是洗掉數字,那么這兩行錯誤地變得相同:
file1: foo bar
file2: foo bar
而如果您用換行符替換數字,那么它們正確地保持不相同:
file1: foo
bar
file2: foo bar
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/480488.html
下一篇:如何僅使用系統呼叫創建鏈表
