You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于userid将file2属性追加到file1对应行(Bash方案)

Bash实现两个CSV文件按userid匹配追加属性

高效解决方案:awk命令

这是最适配场景的工具,无需逐行循环,一次遍历即可完成处理:

awk -F',' 'NR==FNR {attr[$1]=$2; next} {print $0","attr[$1]}' file2.csv file1.csv > output.csv

参数说明

  • -F',':指定CSV的分隔符为逗号,若使用制表符则改为-F'\t'
  • NR==FNR:仅处理第一个传入的文件(file2.csv),将userid作为键,对应第二列属性存入数组attr
  • next:跳过当前行的后续处理,直接读取下一行
  • 处理file1.csv时,输出当前行内容+逗号+对应userid的属性,结果写入output.csv

带表头的处理方式

如果两个文件都有表头,需要保留表头并追加列名:

awk -F',' 'NR==FNR {if(NR>1) attr[$1]=$2; next} {if(NR==1) print $0",extra_attribute"; else print $0","attr[$1]}' file2.csv file1.csv > output.csv

备选方案:join命令

若偏好使用专门的合并工具,可先用sort排序文件(join要求文件按关联字段排序),再合并:

  1. 排序文件(若未排序):
sort -t',' -k1,1 file1.csv > sorted_file1.csv
sort -t',' -k1,1 file2.csv > sorted_file2.csv
  1. 合并输出:
join -t',' -o 1.1,1.2,1.3,...,2.2 sorted_file1.csv sorted_file2.csv > output.csv

参数说明

  • -t',':指定分隔符
  • -o:自定义输出字段,1.1代表第一个文件的第1列,2.2代表第二个文件的第2列,根据file1的实际列数补充1.2,1.3,...部分

不推荐逐行循环的原因

用while read逐行读取file1,再用grep/sed查询file2的方式,会重复遍历file2数百/数千次,文件较大时性能极差,远不如上述两种工具高效。

内容的提问来源于stack exchange,提问作者Richard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 18:05:34