使用键连接多个文件



我们如何用 3 列连接多个文件?连接.txt的预期结果,

server7.txt
DATE TIME server7
20140209 00:00-00:05 99.958775783378%
20140209 00:05-00:10 99.951034588364%
20140209 00:10-00:15 99.946565356473%
server8.txt
DATE TIME server8
20140209 00:00-00:05 99.9585236073714%
20140209 00:05-00:10 99.9506962782437%
20140209 00:10-00:15 99.9379659962486%
server9.txt
DATE TIME server9
20140209 00:00-00:05 99.9486422652602%
20140209 00:10-00:15 99.9433509611542%
20140209 00:20-00:25 99.9318584549217%
join.txt
DATE TIME server7 server8 server9
20140209 00:00-00:05 99.958775783378% 99.9585236073714% 99.9486422652602%
20140209 00:05-00:10 99.951034588364% 99.9506962782437% 99.9433509611542%
20140209 00:10-00:15 99.946565356473% 99.9379659962486% 99.9318584549217%

我已经使用

粘贴 -d" " 服务器*.txt

但它连接所有行而不比较键

如上所述,您的输入与预期的输出不完全匹配。 文件server9.txt缺少时间00:05-00:10行,并包含一个额外的00:20-00:25 。 也就是说,以下内容应该让您了解如何加入文件。 谚语:

join -1 1 -2 1 -1 2 -2 2 -o 1.1,1.2,1.3,2.3 server7.txt server8.txt

将产生:

DATE TIME server7 server8
20140209 00:00-00:05 99.958775783378% 99.9585236073714%
20140209 00:05-00:10 99.951034588364% 99.9506962782437%
20140209 00:10-00:15 99.946565356473% 99.9379659962486%

在上面的命令中,我们基于两个文件中的第 1 列和第 2 列连接文件,并从 file1 输出第 1、2、3 列,从 file2 输出第 3 列。

您可以将此输出通过管道传输到第三个文件:

join -1 1 -2 1 -1 2 -2 2 -o 1.1,1.2,1.3,2.3 server7.txt server8.txt | join -1 1 -2 1 -1 2 -2 2 -o 1.1,1.2,1.3,1.4,2.3 - server9.txt

这将导致:

DATE TIME server7 server8 server9
20140209 00:00-00:05 99.958775783378% 99.9585236073714% 99.9486422652602%
20140209 00:10-00:15 99.946565356473% 99.9379659962486% 99.9433509611542%

如上所述,输出和预期输出的差异是由于server9中的TIME列与其他文件中的TIME值不完全匹配。

例如,

如果您有两个文件包含一列:

join -j 2 $2 $1

您可以在 bash 中阅读手动join命令

以下是一些帮助:加入加入2加入3

您还可以通过管道将输出传送到column -t

这有效,但您的输入似乎很奇怪,这会导致奇怪的输出:

awk 'FNR!=1{a[$1" "$2]=a[$1" "$2] " " $3}END{for(i in a)print i a[i]}' server*txt

基本上,"FNR!=1"使其忽略标题行(第1行)。然后,对于读取的每一行,第 3 列将追加到关联数组 (a[]) 中,按字段 1 和 2 编制索引,因此数组元素的索引将是组合的日期和时间字段。

最后,打印出关联数组的所有键以及末尾的聚合正常运行时间。

这将适用于任意数量的 server*.txt 文件,而不会使命令行变得更长、更难以理解。

示例输出:

20140209 00:00-00:05 99.958775783378% 99.9585236073714% 99.9486422652602%
20140209 00:10-00:15 99.946565356473% 99.9379659962486% 99.9433509611542%
20140209 00:20-00:25 99.9318584549217%
20140209 00:05-00:10 99.951034588364% 99.9506962782437%

您可能希望在之后对输出进行排序,因为 awk 数组没有固有的顺序。

相关内容

  • 没有找到相关文章

最新更新