求助:使用Awk基于唯一ID合并两个CSV文件
用Awk按唯一ID匹配合并两个CSV文件的解决方案
没问题,我来帮你搞定这个需求!你之前用paste命令不行是因为它只是简单按行号拼接内容,不会识别并匹配唯一ID,而Awk正好能轻松实现按键(这里就是唯一ID)的关联匹配。
核心思路
我们先把第二个文件(仅2列的SPOOL2.csv)里的ID和对应第二列数据存入一个Awk数组,然后遍历第一个文件(17列的SPOOL1.csv),每一行根据ID去数组里查找对应值,再把原行内容和找到的值拼接起来,最终得到18列的合并文件。
具体命令
直接用这条Awk命令就能实现:
awk -F ',' 'NR==FNR { arr[$1] = $2; next } { print $0 "," arr[$1] }' SPOOL2.csv SPOOL1.csv > MERGED.csv
命令拆解(帮你理解每部分作用)
-F ',':告诉Awk用逗号作为CSV的字段分隔符,如果你的CSV用制表符或其他分隔符,把,改成对应符号即可(比如制表符用\t)。NR==FNR:这个条件只对**第一个输入文件(SPOOL2.csv)**生效(NR是全局行号,FNR是当前文件的行号,处理第一个文件时两者相等)。arr[$1] = $2:把SPOOL2.csv里的第一列(唯一ID)作为数组索引,第二列的值存入数组,后续就能通过ID快速查找对应值。next:跳过后面的代码,直接处理下一行,确保第一个文件只做“存数据到数组”的操作。{ print $0 "," arr[$1] }:处理第二个输入文件(SPOOL1.csv)时,把当前行的所有内容(17列)加上逗号,再拼接上数组中对应ID的第二列值,输出的就是18列的合并行。
可选优化(处理边界情况)
- 跳过无匹配ID的行:如果SPOOL1.csv里的某些ID在SPOOL2.csv中不存在,上面的命令会输出空值。如果你想直接跳过这些行,把命令改成:
awk -F ',' 'NR==FNR { arr[$1] = $2; next } arr[$1] { print $0 "," arr[$1] }' SPOOL2.csv SPOOL1.csv > MERGED.csv
- 处理SPOOL2.csv中的重复ID:如果SPOOL2.csv里有重复的ID,Awk会自动保留最后一次出现的对应值。如果需要先去重,可以先对SPOOL2.csv做去重处理:
sort -u -t ',' -k1,1 SPOOL2.csv > SPOOL2_unique.csv
再用去重后的文件执行上面的Awk命令即可。
为什么paste不行?
paste命令是严格按行号来拼接两个文件的内容,只有当两个文件的行顺序完全一致、且每行的ID一一对应时才会得到正确结果。但只要两个文件的行顺序不同,或者行数不一致,就会出现ID不匹配的错误,这显然不符合你“按唯一ID匹配”的需求。
内容的提问来源于stack exchange,提问作者Fredro
相关产品推荐
相关产品推荐

