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

awk to compare two file by identifier & output in a specific format

我有 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

但是我想打印整行。我怎样才能做到这一点?

我会说:

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 存储在矩阵 a[line number, column] 中。然后,它将其值与文件 2 中的对应值进行比较。

请注意,我使用字段分隔符 | 而不是 || 并分两步循环以使用正确的数据。这是因为我做了 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