如何在Bash中基于File1首列对比3个CSV文件并生成结果
用Bash对比三个CSV文件并生成汇总结果
我来帮你搞定这个问题!用awk就能完美解决这个需求,它处理CSV和关联数组的能力刚好适合这种多文件按日期键汇总的场景。
解决方案:AWK脚本
下面这个脚本会读取三个CSV文件,按日期汇总每个文件对应的值,然后自动判断状态(Match/Unmatch/Missing),最后输出符合你要求的结果文件。
BEGIN { FS = "," OFS = "," print "Date,Value1,Value2,Value3,Status" } # 处理第一个输入文件(File1.csv) FILENAME == ARGV[1] { gsub(/^[[:space:]]+/, "", $1) # 移除日期前的空格,避免键不一致 arr1[$1] = $2 dates[$1] = 1 # 记录所有出现过的日期 next } # 处理第二个输入文件(File2.csv) FILENAME == ARGV[2] { gsub(/^[[:space:]]+/, "", $1) arr2[$1] = $2 dates[$1] = 1 next } # 处理第三个输入文件(File3.csv) FILENAME == ARGV[3] { gsub(/^[[:space:]]+/, "", $1) arr3[$1] = $2 dates[$1] = 1 next } END { # 遍历所有收集到的日期 for (date in dates) { # 获取每个文件对应的值,缺失则为空字符串 val1 = arr1[date] ? arr1[date] : "" val2 = arr2[date] ? arr2[date] : "" val3 = arr3[date] ? arr3[date] : "" # 判断状态 if (val1 != "" && val2 != "" && val3 != "") { # 三个值都存在,判断是否全部相等 status = (val1 == val2 && val2 == val3) ? "Match" : "Unmatch" } else { # 至少有一个值缺失 status = "Missing" } # 输出当前日期的汇总行 print date, val1, val2, val3, status } }
运行步骤
- 把上面的代码保存为
compare_csvs.awk文件 - 在终端执行以下命令,生成结果文件:
awk -f compare_csvs.awk File1.csv File2.csv File3.csv > result.csv
验证结果
运行后,result.csv的内容会和你期望的完全一致:
Date,Value1,Value2,Value3,Status 20180501,1000,1000,1000,Match 20180502,2000,1000,2000,Unmatch 20180503,3000,,3000,Missing 20180504,4000,4000,,Missing
这个脚本还能处理日期前有空格的情况(你的示例文件里就有),确保日期键的一致性,同时不会遗漏任何一个在三个文件中出现过的日期。
内容的提问来源于stack exchange,提问作者issaBoopBeb
相关产品推荐
相关产品推荐

