比较两个文件并使用条件存储差异
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
中的字段 ==rack1
而 file2.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 个数组 a
和 b
,索引分别为 $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"
我设法找到了我的挑战的一半解决方案,但我找不到添加条件来处理另一半的方法。我正在使用 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
中的字段 ==rack1
而 file2.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 个数组 a
和 b
,索引分别为 $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"