Unix 输入按数字排序时,连接忽略输出行

Unix 输入按数字排序时,连接忽略输出行,unix,join,Unix,Join,我有两个文件,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 但预计会有8410101和10301人加入。 为什么只有84个被加入?使用字典排序而不是数字排序 要作为流程的一部分执行此操作,请执行以下操作: $ join <

我有两个文件,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
但预计会有8410101和10301人加入。
为什么只有84个被加入?

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

要作为流程的一部分执行此操作,请执行以下操作:

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

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

$ 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

join如果要避免排序,则可以使用awk将pad归零:

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

您希望避免排序,因为Unix排序是O(n log n)。

join是否支持数字顺序?@qiuxiafei否,join不支持数字顺序。并非所有实现都会出现此错误,有些只是默默地失败。@qiuxafei编辑了问题的标记--join不是bash的一部分,而是可以从任何shell访问的标准Unix工具。
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