加入密钥多个文件

时间:2014-02-15 08:31:44

标签: bash scripting

我们如何使用3列加入多个文件? join.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

但它加入所有行而不比较一个键

3 个答案:

答案 0 :(得分:2)

作为commented above,您的输入与预期输出不完全匹配。文件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列,从文件2输出第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%

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

答案 1 :(得分:1)

例如,如果您有两个文件,其中包含一列:

join -j 2 $2 $1

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

这里有一些帮助: join join2 join3

您还可以将输出传输到column -t

答案 2 :(得分:0)

这样可行,但你的输入看似奇怪,导致奇数输出:

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

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

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

这适用于任何数量的服务器* .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数组没有固有的顺序。