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

如何在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
    }
}

运行步骤

  1. 把上面的代码保存为compare_csvs.awk文件
  2. 在终端执行以下命令,生成结果文件:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:57:01