如何用awk/Bash跨文件按相同SOL_number合并MGD_number?
问题分析与解决方法
错误原因
- join的硬性要求:
join命令强制要求输入的两个文件按连接字段(此处为第2列SOL_number)预先排序,且排序规则完全一致,否则会直接报错或输出错误结果。你直接执行join时报错,就是因为原文件未按SOL_number排序。 - 排序参数误用:
sort -k1 -n是按第一列MGD_number排序,和join需要的连接字段(第2列)完全无关,排序后的文件自然不符合join的匹配逻辑,导致结果错误。- 用
sort -k2 -n时如果没指定-k2,2,会默认从第2列开始到行尾作为排序键,可能引入无关字段干扰排序;另外如果只排序了其中一个文件,另一个文件仍无序,也会导致join匹配错位。
正确解决步骤
1. 按第2列(SOL_number)正确排序两个文件
根据SOL_number的格式选择对应排序方式:
- 如果SOL_number是纯数字:
# -k2,2表示仅用第2列作为排序键,-n表示按数字大小排序 sort -k2,2n file1 > sorted_file1 sort -k2,2n file2 > sorted_file2 - 如果SOL_number带前缀(比如
SOL123这类格式):# 用字典序排序,无需-n参数 sort -k2,2 file1 > sorted_file1 sort -k2,2 file2 > sorted_file2
2. 执行join并提取目标结果
# 按第2列连接两个已排序文件,再提取File1和File2的MGD_number join -j2 sorted_file1 sorted_file2 | awk '{print $2, $3}' > file3
额外说明
由于你的File1和File2的MGD_number范围无重叠(File1是MGD226-MGD450,File2是MGD451-MGD675),同一文件内不会出现需要规避的合并情况,上述命令完全符合需求——仅匹配不同文件中SOL_number相同的行,合并对应的MGD_number。
内容的提问来源于stack exchange,提问作者Jakub
相关产品推荐
相关产品推荐

