比较两个文件并使用条件存储差异

Compare two files and store differences using conditional

我设法找到了我的挑战的一半解决方案,但我找不到添加条件来处理另一半的方法。我正在使用 awk。字段分隔符是 ;,值在双引号内 "。每个文件只有 3 个字段。

我有两个文件 (file1.txt file2.txt) 并且想将差异存储在第三个文件 (results.txt) 中。

file1.txt

"SWITCH1";"rack7";"Datacenter1"
"SWTICH46";"rack1";"rack1"
"ROUTER3";"";"rack1"
"SWITCH7";"rack1";"rack1"
"ROUTER9";"rack1";"rack1"
"ROUTER22";"rack1";"Datacenter4"

file2.txt

"SWITCH1";"rack7";"Datacenter1"
"ROUTER22";";"Datacenter4"
"SWITCH51";"rack7";"Datacenter2"

如果我使用:

awk -F';' 'FNR==NR {a[[=12=]];next} !([=12=] in a)' file1.txt file2.txt

我得到:

"ROUTER22";";"Datacenter4"
"SWITCH51";"rack7";"Datacenter2"

但我想将 file2.txt " 中的 $2 和 file1.txt rack1 中的 $2 视为文件之间的差异。因此,每当我在 file2.txt 上找到一个条目,该条目在字段 </code> 中具有 <code>" 并且在 file1.txt 中的字段 </code> 中具有 <code>rack1 相同的 $1,我不想将其视为差异并丢弃它。

文件每晚动态生成; file1.txt 中的字段 ==rack1file2.txt 中的字段 =="。这是要排除的匹配项,也是我使用上面的 awk 命令设法排除的匹配项。以下是预期的输出:

想要results.txt

"SWITCH51";"rack7";"Datacenter2"

我正在努力寻找处理这种情况的条件。

您可以检查字段 2 的值是否只是 " 并将其替换为 "rack1"

如果替换后 [=14=] 不在数组 a 中,则打印未修改的行,即示例中的 tmp 变量。

awk '
BEGIN{FS=OFS=";"}
FNR==NR {a[[=10=]];next} 
{
  tmp = [=10=]
  sub(/^"$/, "\"rack1\"", )
  if (!([=10=] in a)) print tmp
}
' file1.txt file2.txt

输出

"SWITCH51";"rack7";"Datacenter2"

根据您显示的示例,请尝试以下 awk 代码。简单的解释是,在第一个 Input_file 的阅读中,创建了 2 个数组 ab,索引分别为 $0 和 $1,$3。在下一个 Input_file 的阅读中检查 2 个条件,如果 b 中不存在 $1,$3 并且 a 中不存在 $0,则打印 Input_file2.

中的那一行
awk -F';' '
FNR==NR{
  a[[=10=]]
  b[,]
  next
}
!((,) in b) && !([=10=] in a)
' file1.txt file2.txt

您可以像您一样将原始行存储在数组 a 中,加上修改后的行,其中 "rack1" 替换为 ":

$ awk -F';' -vOFS=';' 'FNR==NR {a[[=10=]]; if(=="\"rack1\"") {="\"";a[[=10=]]}; next}
    !([=10=] in a)' file1.txt file2.txt
"SWITCH51";"rack7";"Datacenter2"

注意 OFS 输出字段分隔符的规范。它是必需的,因为当我们修改 </code> 字段时,<code>awk 使用 OFS 重建 [=17=],默认情况下它是 space,而我们需要它保持 semi-column 用于在解析 file2.txt.

时进行正确比较
awk -F';' '
    NR==FNR { a[[=10=]]; next }
    { key =  FS ( == "\"" ? "\"rack1\"" : ) FS  }
    !(key in a)
' file1.txt file2.txt
"SWITCH51";"rack7";"Datacenter2"