如何按姓名合并两个文件信息为CSV文件,缺失项补“-”?
按姓名合并两个文本文件为CSV(缺失值补“-”)
需求说明
有两个冒号分隔的文本文件:
- 日期文件(示例命名为
dates.txt):每行格式为姓名:日期john:01.01.2001 mary:06.03.2016 - 城市文件(示例命名为
towns.txt):每行格式为姓名:城市john:london mary:new york
需要把它们按姓名合并成CSV文件,表头固定为name,town,date,如果某个人的城市或日期信息缺失,对应位置用-填充。
解决方案:用awk脚本处理
直接写个awk脚本就能搞定,脚本内容如下(保存为merge.awk):
BEGIN { FS = ":"; OFS = ","; print "name,town,date"; } # 先读日期文件,把姓名和日期存进数组 NR == FNR { dates[$1] = $2; next; } # 读城市文件,存姓名和城市,同时记录所有出现过的姓名 { towns[$1] = $2; all_names[$1] = 1; } # 把日期文件里有但城市文件里没有的姓名也加进总名单,然后输出所有结果 END { for (name in dates) { if (!(name in towns)) { all_names[name] = 1; } } for (name in all_names) { town = (name in towns) ? towns[name] : "-"; date = (name in dates) ? dates[name] : "-"; print name, town, date; } }
使用方法
打开终端,执行以下命令:
awk -f merge.awk dates.txt towns.txt > merged.csv
执行后,merged.csv就是合并好的结果文件。
测试示例
情况1:信息完整时
合并后merged.csv内容:
name,town,date john,london,01.01.2001 mary,new york,06.03.2016
情况2:存在缺失时
比如日期文件里john有日期但城市文件里没有john的城市,城市文件里mary有城市但日期文件里没有mary的日期,合并后:
name,town,date john,-,01.01.2001 mary,new york,-
内容的提问来源于stack exchange,提问作者babygroot
相关产品推荐
相关产品推荐

