![排序和连接不起作用的特定情况](https://linux22.com/image/171505/%E6%8E%92%E5%BA%8F%E5%92%8C%E8%BF%9E%E6%8E%A5%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8%E7%9A%84%E7%89%B9%E5%AE%9A%E6%83%85%E5%86%B5.png)
我在使用 . 连接下面链接的两个文件时遇到问题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
您需要使用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