У меня есть на вид простой вопрос, для которого я не могу найти ответ.
Скажите, у меня есть два файла:
A
B
C
D
и
A
X
Y
D
Когда я работаю diff -U 1000
на них я добираюсь:
A
-B
-C
+X
+Y
D
Вместо этого я хотел бы добраться:
A
-B
+X
-C
+Y
D
Большое изображение для понимания то, что я пытаюсь выполнить: у Меня есть запланированный сценарий, который работает smartctl
на моих жестких дисках сохраните исторические данные и сравните их. Так, измененные строки являются, действительно, отдельными заменами для соответствующих строк более раннего файла:
- 3 Spin_Up_Time 0x0027 173 168 021 Pre-fail Always - 2350
- 4 Start_Stop_Count 0x0032 096 096 000 Old_age Always - 4445
+ 3 Spin_Up_Time 0x0027 172 168 021 Pre-fail Always - 2358
+ 4 Start_Stop_Count 0x0032 096 096 000 Old_age Always - 4461
Я закончил с двухступенчатым процессом: передача к git diff
и затем выполняя последующую обработку его со сценарием AWK:
git diff --word-diff=porcelain -U10000 %1 %2 |
awk -f mysmartdiff.awk;
Первый шаг возвращает результат в следующей форме:
~
3 Spin_Up_Time 0x0027
-172
+173
168 021 Pre-fail Always -
-2358
+2333
и второй сценарий делает это:
mysmartdiff.awk
сценарий следующий:
BEGIN {
DEBUG=0
l1=""
l2=""
old=""
new=""
}
function dprint(s) { if(DEBUG) {print s > "/dev/stderr"} }
function appendDiff() {
if(length(old)!=0 || length(new)!=0) {
l1 = l1"\033[1;31m"old"\033[0m"
l2 = l2"\033[1;32m"new"\033[0m"
old="";new="";
}
}
{
dprint(">>>>>>>>>>>>>>")
dprint("ORIG: " $0)
if(match($0, /^ /)) {
appendDiff();
l1 = l1""substr($0,2)
l2 = l2""gensub(/[^-]/, " ", "g", substr($0,2)); ## leave '-' to aid further space trimming
} else if(match($0, /^~/)) {
appendDiff();
print l1;
if(l2 !~ /^[ -]+$/) {
print l2;
}
l1=""
l2=""
} else if(match($0, /^-/)) {
old=substr($0,2);
} else if(match($0, /^+/)) {
new=substr($0,2);
}
}