如何基于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作为键,对应第二列属性存入数组attrnext:跳过当前行的后续处理,直接读取下一行- 处理
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要求文件按关联字段排序),再合并:
- 排序文件(若未排序):
sort -t',' -k1,1 file1.csv > sorted_file1.csv sort -t',' -k1,1 file2.csv > sorted_file2.csv
- 合并输出:
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
相关产品推荐
相关产品推荐

