Bash - 比较两个文本文件并找出缺失的行

3

我有一台流量生成器生成的两个日志文件。

日志格式如下:

[数据包ID][发送小时][发送分钟][发送秒数][接收小时][接收分钟][接收秒数][数据包大小][流编号]

第一个文件是发送方日志:

  1 13 15 17.799915 13 15 17.799915 512 1
  2 13 15 17.800016 13 15 17.800016 512 1
  3 13 15 17.800034 13 15 17.800034 512 1
  4 13 15 17.800050 13 15 17.800050 512 1
  5 13 15 17.800081 13 15 17.800081 512 1
  6 13 15 17.800094 13 15 17.800094 512 1
  7 13 15 17.800117 13 15 17.800117 512 1
  8 13 15 17.800126 13 15 17.800126 512 1
  9 13 15 17.800135 13 15 17.800135 512 1
 10 13 15 17.800157 13 15 17.800157 512 1
 11 13 15 17.800166 13 15 17.800166 512 1
 12 13 15 17.800173 13 15 17.800173 512 1
 13 13 15 17.800181 13 15 17.800181 512 1
 14 13 15 17.800202 13 15 17.800202 512 1
 15 13 15 17.800212 13 15 17.800212 512 1
 16 13 15 17.800220 13 15 17.800220 512 1
 17 13 15 17.800228 13 15 17.800228 512 1
 18 13 15 17.800257 13 15 17.800257 512 1
 19 13 15 17.800266 13 15 17.800266 512 1
 20 13 15 17.800274 13 15 17.800274 512 1
 21 13 15 17.800297 13 15 17.800297 512 1
 22 13 15 17.800305 13 15 17.800305 512 1
 23 13 15 17.800313 13 15 17.800313 512 1
 24 13 15 17.800321 13 15 17.800321 512 1
 25 13 15 17.800343 13 15 17.800343 512 1
 26 13 15 17.800351 13 15 17.800351 512 1
 27 13 15 17.800359 13 15 17.800359 512 1
 28 13 15 17.800367 13 15 17.800367 512 1
 29 13 15 17.800387 13 15 17.800387 512 1
 30 13 15 17.800397 13 15 17.800397 512 1
 31 13 15 17.800404 13 15 17.800404 512 1
 32 13 15 17.800414 13 15 17.800414 512 1
 33 13 15 17.800436 13 15 17.800436 512 1
 34 13 15 17.800444 13 15 17.800444 512 1
 35 13 15 17.800452 13 15 17.800452 512 1
 36 13 15 17.800460 13 15 17.800460 512 1
 37 13 15 17.800483 13 15 17.800483 512 1
 38 13 15 17.800491 13 15 17.800491 512 1
 39 13 15 17.800499 13 15 17.800499 512 1
 40 13 15 17.800507 13 15 17.800507 512 1

它会一直持续数千行。

第二个文件是接收者文件:

  1 13 15 17.799915 13 15 17.800965 512 1
  3 13 15 17.800034 13 15 17.801605 512 1
  5 13 15 17.800081 13 15 17.802808 512 1
  7 13 15 17.800117 13 15 17.811653 512 1
  8 13 15 17.800126 13 15 17.811686 512 1
  9 13 15 17.800135 13 15 17.811992 512 1
 11 13 15 17.800166 13 15 17.812425 512 1
 13 13 15 17.800181 13 15 17.812966 512 1
 15 13 15 17.800212 13 15 17.814371 512 1
 17 13 15 17.800228 13 15 17.814813 512 1
 19 13 15 17.800266 13 15 17.815244 512 1
 21 13 15 17.800297 13 15 17.815804 512 1
 23 13 15 17.800313 13 15 17.816314 512 1
 25 13 15 17.800343 13 15 17.816805 512 1
 27 13 15 17.800359 13 15 17.817385 512 1
 29 13 15 17.800387 13 15 17.817930 512 1
 31 13 15 17.800404 13 15 17.819176 512 1
 33 13 15 17.800436 13 15 17.819654 512 1
 35 13 15 17.800452 13 15 17.820115 512 1
 37 13 15 17.800483 13 15 17.820649 512 1
 39 13 15 17.800499 13 15 17.821185 512 1
 41 13 15 17.800528 13 15 17.821781 512 1
 43 13 15 17.800545 13 15 17.822329 512 1
 45 13 15 17.800573 13 15 17.822976 512 1
 47 13 15 17.800590 13 15 17.824001 512 1
 49 13 15 17.800619 13 15 17.824448 512 1
 51 13 15 17.800738 13 15 17.824963 512 1
 53 13 15 17.800772 13 15 17.828931 512 1
 55 13 15 17.800788 13 15 17.829416 512 1
 57 13 15 17.801005 13 15 17.829820 512 1
 59 13 15 17.801035 13 15 17.830404 512 1
 61 13 15 17.801053 13 15 17.830873 512 1
 63 13 15 17.801088 13 15 17.831448 512 1
 65 13 15 17.801106 13 15 17.832285 512 1
 67 13 15 17.801225 13 15 17.832860 512 1
 69 13 15 17.801243 13 15 17.833318 512 1
 71 13 15 17.801274 13 15 17.833921 512 1
 73 13 15 17.801290 13 15 17.834448 512 1
 75 13 15 17.801321 13 15 17.834983 512 1
 77 13 15 17.801339 13 15 17.835492 512 1

并且它还延续了几千行。

第二个文件的第一列不一定有序。 正如您可能已经看到的那样,以相同ID开头的2个文件的行不相等(时间戳不同)。

我想隔离那些在第一个文件中但在第二个文件中缺失的数据包(行)。也就是说,我想知道已发送但未接收到的数据包的时间戳。这些文件的主键是第一列(分组包的ID)。 问题是我尝试使用sortjoin,但我无法获得所需的结果。

谢谢

1个回答

2
您可以使用以下awk脚本来实现此功能:
awk 'FNR==NR{a[$1]=$0;next} !($1 in a) {print $1, $4}' file2 file1

非常感谢您的快速回复。我必须学习更多关于awk,它是如此强大。您能告诉我在哪里可以找到学习资源,以便理解您的解决方案吗? - condorwasabi
FNR==NR 块在第一个文件中执行,而 !($1 in a) 在第二个文件中执行。a 是一个关联数组。您可以在上面提供的教程中了解更多关于 awk 的内容。 - anubhava

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接