2014-02-15 33 views
2

我們如何加入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

但它的加入沒有比較關鍵

+0

什麼是組合線的邏輯?觀察'server9.txt'中各個列的'TIME'。 '00:20-00:25' - 這不會出現在其他文件中。 – devnull

回答

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% 

在上述命令中,我們從file1和柱3加入基於在這兩個文件,3列1和2和輸出列1 2,文件來自file2。

可以通過管道將這個輸出到第三檔:

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值不完全匹配。

+1

黑客! .................. :) – hek2mgl

+0

@devnull謝謝你... – MLSC

+0

@devnull你也可以使用'--header'以便在第一行不起作用 – MLSC

1

所有行例如,如果您有一列兩個文件:

join -j 2 $2 $1 

您可以在bash閱讀說明書join命令

這裏有一些幫助: join join2 join3

你也可以管道輸出到column -t

+0

'join'接受2個文件,但有(至少)3個輸入文件。如何級聯這個? – hek2mgl

+0

你可以編輯任何你想要的......三個文件等 – MLSC

+0

不,這不起作用(我仍然基本上喜歡這個嘗試) – hek2mgl

0

這工作,但您的輸入似乎很奇怪,這會導致奇數輸出:

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列被添加到由字段1和2索引的關聯數組(a []),因此數組元素的索引將是合併的日期和時間字段。

最後,關聯數組的所有關鍵字都打印出來並加上最後的聚合正常運行時間。

這將適用於任何數量的服務器* .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陣列輸出後進行排序。