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个?

4

3 回答 3

9

使用字典排序而不是数字排序。

作为该过程的一部分执行此操作:

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

这给出了输出:

10101 sdf 22232
10301 23 llll
84 xxx asdfasdf
于 2012-05-14T14:12:55.057 回答
7

您未能包括输出错误消息的事实:

$ 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
于 2012-05-14T14:14:55.763 回答
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)。

于 2015-01-29T14:11:51.060 回答