awk按标识符&比较两个文件以特定格式输出

时间:2015-05-18 10:18:10

标签: awk pattern-matching gawk

我有2个大文件,我需要比较所有管道分隔

档案1

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

文件2

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

现在我要比较文件&相应地打印,例如如果文件2中找到的任何更新将打印为updated_value#oldvalue&添加到文件2的任何新行也将相应更新。

所以期望的输出是:(仅更新和新数据)

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

我到目前为止尝试的是获取分离的更改值:

awk -F '[||]+' 'NR==FNR{for(i=1;i<=NF;i++)a[NR,i]=$i;next}{for(i=1;i<=NF;i++)if(a[FNR,i]!=$i)print $i"#"a[FNR,i]}' file1 file2 >output

但我想打印整条线。我怎样才能实现这个目标?

1 个答案:

答案 0 :(得分:1)

我会说:

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

这将file1存储在矩阵a[line number, column]中。然后,它将其值与file2中的对应关系进行比较。

注意我使用字段分隔符|而不是||并以两步为单位循环以使用正确的数据。这是因为我举例gawk -F'||' '{print NF}' f1而得到的只是1,这意味着FS没有得到很好的理解。如果有人在这里指出错误,将不胜感激!

测试

$ 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
a||d||f||b#a
1||1#2||3||4
1||2||r||f