排序和连接不起作用的特定情况

排序和连接不起作用的特定情况

我在使用 . 连接下面链接的两个文件时遇到问题join -t $'\t' -a1 file_1 file_2。我知道在排序时必须使用特定标志才能使连接工作,如中所述邮政。具体来说,我使用以下语法对 file_1 和 file_2 进行了排序:cat file_1 | LANG=en_EN sort k1b,1

我得到的错误是这样的:

https://drive.google.com/open?id=1vlh9NqD1Nlm6dQi33Qt0gevsLfYxRURN

这是有问题的。例如,条目“S2_005_008G1__bin.1”尽管同时存在于 file_1 和 file_2 中,但无法加入。

抱歉,我无法给出一个简单的玩具示例,但我无法使用手工制作的文件重新生成此错误。我真的不知道什么可能会导致这个问题。

文件_1,文件_2

答案1

您需要使用join和的匹配选项和区域设置sort。如果您指定join使用制表符分隔字段,则还需要指定sort使用制表符分隔字段(默认为空格分隔)。

设置LANG环境变量可能会也可能不会设置LC_COLLATE区域设置:如果设置了环境LC_COLLATE,则它优先于,如果设置了LANG环境变量,则它设置所有区域设置。LC_ALL设置 LC_* 但不设置 LC_ALL

除非您需要以特定的“人性化”方式对文件进行排序,否则请使用C排序规则语言环境,它仅使用字节顺序。除非您需要其他一些不同的区域设置,否则请LC_ALL确保覆盖从脚本其余部分或父进程继承的任何设置。无论如何,请确保对join和使用相同的区域设置sort

LC_ALL=C sort -t $'\t' -k 1b,1 file_1 >file_1.sorted
LC_ALL=C sort -t $'\t' -k 1b,1 file_2 >file_2.sorted
LC_ALL=C join -t $'\t' -a1 file_1.sorted file_2.sorted

相关内容