Unix 输入按数字排序时,连接忽略输出行
我有两个文件,aa和bb: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 <
$ 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