根据两个文件之间特定列的差异追加到 file1

根据两个文件之间特定列的差异追加到 file1

我想比较这两个文件,只打印这一行并将其附加到“source.txt”:

01.02.70 08h00,4.4.4.4,443

这是我的文件:

源文件.txt

DATETIME,IPSOURCE,PORT
01.01.70 08h00,0.0.0.0,443
01.01.70 08h00,2.2.2.2,443

事件.txt

DATETIME,IPSOURCE,PORT
01.02.70 09h00,0.0.0.0,443
01.02.70 09h00,2.2.2.2,443
01.02.70 08h00,4.4.4.4,443

我不关心比较中的 DATETIME 字段,我只想将日志文件“events.txt”中出现的新 IP 添加到“source.txt”(地址 0.0.0.0 和 2.2.2.2 出现在两个文件)。

所以我想用

grep -vxFf source.txt events.txt

在不考虑第一个字段的情况下,我仅查找 IPSOURCE 字段(第二列)中的差异。

答案1

awk当您需要基于字段的比较时使用

$ awk -F, 'NR==FNR{ip[$2]=$0; next} $2 in ip{delete ip[$2]} END{for(k in ip) print ip[k]}' events.txt source.txt
01.02.70 08h00,4.4.4.4,443
  • -F,设置,为输入字段分隔符
  • NR==FNR{ip[$2]=$0; next}使用第二个字段作为键并将整行保存在关联数组中。此代码块仅针对第一个文件输入(即 events.txt)执行
  • $2 in ip{delete ip[$2]}当第二个文件(即 source.txt)正在处理时,ip如果第二个字段已存在,则删除数组中的元素
  • END{for(k in ip) print ip[k]}处理完所有输入后,打印ip数组中剩余的行


或者,如果 source.txt 中不存在第二个字段,则更改输入文件的顺序并打印 events.txt 中的行

$ awk -F, 'NR==FNR{ip[$2]; next} !($2 in ip)' source.txt events.txt
01.02.70 08h00,4.4.4.4,443

答案2

只需执行以下操作:

awk -F, 'NR==FNR{arr[$2]=$0;next} !($2 in arr)' source event #>> source

如果您想基于带有逗号分隔字段的第二列附加差异行,只需>> source在上面的命令中取消注释即可。

不,如果您想根据 IP:端口部分进行比较。然后你可以使用如下。

awk -F, 'NR==FNR{arr[$2FS$3]=$0;next} !($2FS$3 in arr)' source event #>> source

答案3

根据你的条件:

  • 将其附加到“source.txt”

  • 我只想添加新的日志文件“events.txt”到“source.txt”中显示的 IP


这是一个基于GNU结合的完整解决方案sed,grep

sed -i "\$ a $(cut -d, -f2 source.txt | grep -vf - events.txt)" source.txt

生成的source.txt文件内容:

DATETIME,IPSOURCE,PORT 
01.01.70 08h00,0.0.0.0,443 
01.01.70 08h00,2.2.2.2,443
01.02.70 08h00,4.4.4.4,443

相关内容