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