Я ищу заранее два файла сравнения 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
это 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}}
к концу.
Других решений пока нет …