Как сделать 'различный' вывод линию за линией?

У меня есть на вид простой вопрос, для которого я не могу найти ответ.

Скажите, у меня есть два файла:

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
1
задан 4 June 2018 в 18:29

1 ответ

Я закончил с двухступенчатым процессом: передача к 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

и второй сценарий делает это:

screenshot of final result

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);
    }
}
0
ответ дан 8 December 2019 в 00:45

Другие вопросы по тегам:

Похожие вопросы: