使用join合并文件时含字母点号数字序列的排序问题问询
问题解决方法
核心原因
join命令要求两个输入文件必须按照关联的键列做符合POSIX标准的字典序排序,你之前的操作失效主要是两个常见问题:
- 排序时的区域设置(locale)和join运行时的区域设置不一致,导致排序规则不匹配
- 仅执行sort命令没有将排序结果写入新文件,join读取的还是原始未排序文件
正确操作步骤
方式1:先生成排序后的中间文件
- 对file1按第二列排序,使用C locale保证排序规则和join匹配:
LC_ALL=C sort -k2,2 file1 > file1.sorted - 对file2按第二列排序:
LC_ALL=C sort -k2,2 file2 > file2.sorted - 执行join命令:
join -1 2 -2 2 -o 2.1 1.1 2.2 2.3 2.4 file1.sorted file2.sorted
方式2:使用进程替换避免生成中间文件
可以直接将排序后的结果通过管道传递给join,不需要生成临时文件:join -1 2 -2 2 -o 2.1 1.1 2.2 2.3 2.4 <(LC_ALL=C sort -k2,2 file1) <(LC_ALL=C sort -k2,2 file2)
补充说明
如果你的字段分隔符不是默认的空白符,需要在sort和join命令里都加上-t参数指定分隔符,比如分隔符是制表符的话,两个命令都要加-t $'\t'。
内容的提问来源于stack exchange,提问作者avsill
相关产品推荐
相关产品推荐

