我有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
但我想打印整条线。我怎样才能实现这个目标?
答案 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