差异连续行 unix
Diff consecutive lines 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
本质上,上一行和当前行之间的公共元素不会再次打印 -> 只会打印两行之间的差异。
有人可以帮忙吗?
awk '{for (i=1;i<=length([=10=]); i++)
if (substr([=10=],i,1)!=substr(a,i,1)) {printf "%s",substr([=10=],i,1);a=""}
else printf " ";
printf "\n"
a=[=10=]}'
产量
a<1 and b<1 and c<1 then result=1
>1 and d<1 then result=2
>1 then result=3
即不再打印上一行和当前行之间的公共字符
如果您需要发布的结果,您可以拆分行以形成标记并将这些标记与上一行的标记进行比较。您可以打印令牌或必要的空格来获取标识。
备选方案,使用字段作为匹配单位,最终输出格式
awk 'NR==1{w=length([=10=])}
{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
我有一棵扁平化的树,如:
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
本质上,上一行和当前行之间的公共元素不会再次打印 -> 只会打印两行之间的差异。
有人可以帮忙吗?
awk '{for (i=1;i<=length([=10=]); i++)
if (substr([=10=],i,1)!=substr(a,i,1)) {printf "%s",substr([=10=],i,1);a=""}
else printf " ";
printf "\n"
a=[=10=]}'
产量
a<1 and b<1 and c<1 then result=1
>1 and d<1 then result=2
>1 then result=3
即不再打印上一行和当前行之间的公共字符
如果您需要发布的结果,您可以拆分行以形成标记并将这些标记与上一行的标记进行比较。您可以打印令牌或必要的空格来获取标识。
备选方案,使用字段作为匹配单位,最终输出格式
awk 'NR==1{w=length([=10=])}
{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