GNU join v8.22关联文件时输出列被覆盖问题求助
问题原因
你遇到的异常是GNU coreutils 8.22版本中join命令的--header参数存在已知缺陷:开启该参数后,跨文件指定输出字段时会出现字段索引计算错位,导致后一个文件的内容覆盖前一个文件的字段、键列丢失等问题。该缺陷在coreutils 8.26及更高版本中已被官方修复。
解决方案
方案1:升级coreutils(推荐)
如果你的环境允许升级系统依赖,直接将coreutils升级到8.26及以上的稳定版本,你原本写的命令就可以正常运行,无需修改参数。
方案2:手动处理表头(兼容8.22版本)
如果无法升级环境,可以避开有问题的--header参数,单独处理表头和内容拼接即可,步骤如下:
- 先手动生成表头并写入结果文件:
echo "KEY;COLUMN1_FILE1;COLUMN2_FILE1;COLUMN3_FILE1;COLUMN4_FILE1;COLUMN1_FILE2;COLUMN2_FILE2" > result.csv
你也可以根据自己的需求自定义表头内容。
2. 跳过两个输入文件的表头行,对内容部分执行join操作,结果追加到上述结果文件中:
LC_ALL=C join -j 1 -a 1 -a 2 -t ';' -o 0,1.2,1.3,1.4,1.5,2.2,2.3 <(sed '1d' FILE1.TXT) <(sed '1d' FILE2.TXT) >> result.csv
这里使用sed '1d'跳过输入文件的第一行表头,避免触发--header的bug,进程替换语法<(命令)可以直接把sed处理后的内容传递给join命令,不需要生成临时文件。
最终生成的result.csv就是符合预期的关联结果。
内容的提问来源于stack exchange,提问作者lopezishere
相关产品推荐
相关产品推荐

