2015-08-25 6 views
0

У меня есть дерево в уплощенных из линий, как:Diff последовательных строк UNIX

a<1 and b<1 and c<1 then result=1 
a<1 and b>1 and d<1 then result=2 
a<1 and b>1 and d>1 then result=3 

Я хочу напечатать удалить подстроку каждой последовательной линии, которая соответствует с предыдущей строкой Например, результат будет:

a<1 and b<1 and c<1 then result=1 
     b>1 and d<1 then result=2 
       d>1 then result=3 

По существу, общий элемент между предыдущей строкой и текущей строкой не печатается снова -> печатаются только различия между двумя строками.

Может кто-нибудь помочь?

+0

должна быть в оболочке? Что вы уже пробовали? – pacholik

ответ

1

альтернатива, используя поля в качестве единицы матча с конечными выходными форматирования

awk 'NR==1{w=length($0)} 
    {sep=line=""; 
     for(i=1;i<=NF;i++) 
     if(p[i]!=$i) 
      for(j=i;j<=NF;j++) { 
      p[j]=$j; 
      line=line sep $j; 
      sep=OFS 
      } 
     printf "%"w"s\n", line 
     }' diffs 

a<1 and b<1 and c<1 then result=1 
     b>1 and d<1 then result=2 
       d>1 then result=3 
+0

Выбор первой строки для ширины приводит к некоторому интересному форматированию в расширенных версиях данных (у меня возникло бы желание использовать 'w = length ($ 0) 'на каждой строке), но в противном случае, о чем попросил ОП. –

+0

Да, это предполагает, что корень «дерева» - это первая строка. Возможно, предварительное сканирование файла, чтобы получить максимальную длину, является лучшим решением. – karakfa

+0

Я провел ваш код в более длинном тестовом файле с некоторыми двузначными результатами. Он создал несколько интересных совпадений с кодом - только один персонаж, так как длина строк менялась только так. –

0
awk '{for (i=1;i<=length($0); i++) 
    if (substr($0,i,1)!=substr(a,i,1)) {printf "%s",substr($0,i,1);a=""} 
     else printf " "; 
    printf "\n" 
    a=$0}' 

дает

a<1 and b<1 and c<1 then result=1 
     >1 and d<1 then result=2 
       >1 then result=3 

т.е. общие символы между предыдущей строкой и текущей строкой не печатаются снова

Если вам нужно размещен результат, вы можете разделить вашу линию, чтобы сформировать маркеры и сравните те жетоны с токенами предыдущей строки. Вы должны либо распечатать токен, либо необходимые пробелы, чтобы получить идентификацию.

+0

Не совсем ясно, что вы должны сбросить 'b' из второй строки или' d' из третьей строки; Думаю, это немного с энтузиазмом. –

+0

Поэтому я написал текст в результате. Он подходит для запроса удалить совпадающую подстроку из предыдущей строки, но не пример. Вот почему я упомянул метод на основе токенов, который я не разрабатывал ... – user3188140

Смежные вопросы