Shell — разница между файлами и параметрами в каждой строке

Я ищу заранее два файла сравнения shell / bash / php. Допустим, у меня есть такие файлы:

file1

.run file=test_script.sql rev=1.1
.run file=test_sql.sql rev=1.1
.run file=test_drop.sql rev=1.2

file2

.run file=test_drop.sql rev=1.2
.run file=test_grant.sql rev=1.1
.run file=test_script.sql rev=1.2

получить разницу между этими файлами (игнорируя порядок строк), который

.run file=test_grant.sql rev=1.1 #(because new line wasn't in file1 at all)
.run file=test_script.sql rev=1.2 #(because rev changed from rev=1.1 to rev=1.2)

но это еще не все, я хочу проверить, было ли то же самое (.run file = name) в старом файле, и если это было так, то получить его (rev = number). Так что окончательный вывод будет выглядеть так:

file3:

 test_grant.sql 1.1 1.1
test_script.sql 1.1 1.2

до сих пор:
fgrep -x -v -f file1 file2

получает

.run file=test_grant.sql rev=1.1
.run file=test_script.sql rev=1.2

-1

Решение

это awk скрипт должен делать то, что вы хотите:

awk 'NR==FNR {
map[$2]=$3
next;
}

!map[$2] || (map[$2] != $3) {
sub3=substr($3, index($3,"=")+1)
subm2=substr(map[$2], index(map[$2],"=")+1)
print substr($2, index($2,"=")+1), subm2?subm2:sub3, sub3
}' file1 file2

Смотря на первый файл (NR==FNR) хранить rev поле в map массив под file ключ.

Просматривая второй файл (второй блок), если file поле в этой строке не в map массив или текущий rev поле не соответствует rev затем напечатайте текущую строку.

Для обработки удаленных строк вы хотели бы добавить {delete map[$2]} после второго блока, а затем добавить END {for (rev in map) {print "Missing: .run "map[rev]" "rev}} к концу.

1

Другие решения

Других решений пока нет …