Вот возможный способ сделать это с помощью традиционных инструментов и конвейеров. Я использую терминологический ключ и значение, так как файл выглядит как
key = value
Следующий список команд дает вам возможные ответы:
# lines common between file1 and file2
grep -F -f file1 file2
# lines in file2 not in file1
grep -v -F -f file1 file2
# changed key values from file1 to file2
cut -d'=' -f1 file1 | grep -F -f - <(grep -v -F -f file1 file2)
# keys in file1 but not in file2
cut -d'=' -f1 file1 | grep -v -F -f - file2
# keys in file2 but not in file1
cut -d'=' -f1 file2 | grep -v -F -f - file1
Или вы можете просто пойти на один простой awk,это не самый оптимизированный, но дает чистый вывод:
$ awk '
BEGIN{FS=" *= *"}
{key=$1;value=$2}
(NR==FNR){a[key]=value; next}
{b[key] = value }
END {
for (key in a) if (key in b) {
print (a[key] == b[key] ? "COMM" : "DIFF"), key,"=",a[key],"<=>",b[key]
delete a[key]
delete b[key]
}
for (key in a) {
print "UNI1", key,"=",a[key]
}
for (key in b) {
print "UNI2", key,"=",b[key]
}
}' file1 file2
Это даст некоторый вывод, похожий на
COMM key1 = val1 <=> val1
COMM key2 = val2 <=> val2
DIFF key3 = val31 <=> val32
COMM key4 = val4 <=> val4
UNI1 key5 = val5
UNI2 key6 = val6