差异连续行unix

时间:2015-08-25 13:58:33

标签: linux unix binary-tree diff

我的树有扁平的线条,如:

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

基本上,前一行和当前行之间的公共元素不会再次打印 - &gt;只打印两行之间的差异。

有人可以帮忙吗?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

即。上一行和当前行之间的常用字符不会再次打印

如果您需要发布结果,可以将行拆分为表单标记,并将这些标记与前一行的标记进行比较。你可以打印令牌或必要的空格来获得身份。