2015-05-20 32 views
0

这是awk-to-compare-two-file-by-identifier-output-in-a-specific-format比较两个文件和标记已更改的字段。

一个延长的问题,作为指定假设两种文件有一定的差异

file 1 

a||d||f||a 
1||2||||4 


file 2 

a||d||f||a 
1||1||3||4 
1||2||r||f 

其中所希望输出将是

1||1#2||3#||4 
1||2||r||f 

在这里你可以看到我只想比较文件&相应的打印,例如,如果在文件2中发现任何更新将被打印为updated_value#oldvalue &任何新的行广告文件2的文件也将相应更新。

&我现在想的差输出作为@fedorqui建议

awk 'BEGIN{FS=OFS="|"} 
    FNR==NR {for (i=1;i<=NF;i+=2) a[FNR,i]=$i; next} 
    {for (i=1; i<=NF; i+=2) 
     if (a[FNR,i] && a[FNR,i]!=$i) 
      $i=$i"#"a[FNR,i] 
    }1' f1 f2 

导致

1||1#2||3||4 
1||2||r||f 

这个工作得很好,但它无法处理空行作为变化的要求。谁能帮我?

回答

0

不能发表评论,但bongboys回答会产生

a||d||f||a 
1||1#2||3#||4 
1#||2#||r#||f# 

这不是预期的输出

此命令

awk 'BEGIN{FS=OFS="|"} 
    NR==FNR{for(i=1;i<=NF;i++)a[FNR" "i]=$i;b[FNR]=$0;next} 
    {for(i=1;i<=NF;i++)(FNR" "i in a)&&a[FNR" "i]!=$i&&$i=$i"#"a[FNR" "i]} 
    !(b[FNR]==$0)' file{1,2} 

产生

1||1#2||3#||4 
1||2||r||f 

这是预期的输出。

0

好吧,我找到了answer.i'm发布它,这样你可能会对某人有所帮助。

awk 'BEGIN{FS=OFS="|"} FNR==NR {for (i=1;i<=NF;i++) a[FNR,i]=$i; next} {for (i=1; i<=NF; i++) if (a[FNR,i] !=$i) $i=$i"#"a[FNR,i]}1' 

这里是输出

1||1#2||3#||4 
1||2||r||f