2012-05-14 17 views
5

我有兩個文件,AA和BB:聯接省略輸出線,當輸入的有序數值

$ cat aa 
84 xxx 
85 xxx 
10101 sdf 
10301 23 

$ cat bb 
82 asd 
83 asf 
84 asdfasdf 
10101 22232 
10301 llll 

我使用join命令加入他們的行列:

$ join aa bb 
84 xxx asdfasdf 

但什麼預期爲84,10101和10301全部加入。 爲什麼只有84加入?

+0

@qiuxafei編輯了問題的標記 - 連接不是bash的一部分,而是可從任何shell訪問的標準UNIX工具。 –

回答

8

使用詞典排序而不是數字排序。

要做到這一點作爲這一進程的一部分:

$ join <(sort aa) <(sort bb) 

這使輸出:

10101 sdf 22232 
10301 23 llll 
84 xxx asdfasdf 
+2

是否加入支持數字命令? – qiuxiafei

+1

@qiuxiafei不,加入不支持數字命令。 –

6

你沒有包括事實的錯誤消息是輸出:

$ join aa bb 
join: file 2 is not in sorted order 
84 xxx asdfasdf 
join: file 1 is not in sorted order 
您可以使用正常的字典編排:
join <(sort aa) <(sort bb) | sort -k1,1n 
+2

不是所有的實現都會出現這個錯誤 - 有些只是默默地失敗。 –

3

如果你想避免排序,那麼你可以填零使用awk:

join \ 
<(awk '{printf("%05d %s\n", $1, $2)}' aa) \ 
<(awk '{printf("%05d %s\n", $1, $2)}' bb) \ 
| awk '{print int($1),$2,$3}' 

生成的輸出,可以保留原來的排序順序:

84 xxx asdfasdf 
10101 sdf 22232 
10301 23 llll 

你要避免排序,因爲Unix排序是O(n log n)。