bash - 如何根据 File1 第一列比较 3 个 csv 文件
问题描述
我正在尝试在 bash 中比较 3 个 csv 文件并将结果保存为新文件,无论值是否匹配
文件 1.csv
20180501,1000
20180502,2000
20180503,3000
20180504,4000
文件2.csv
20180501,1000
20180502,1000
20180504,4000
文件 3.csv
20180501,1000
20180502,2000
20180503,3000
预期产出
Date,Value1,Value2,Value3,Status
20180501,1000,1000,1000,Match
20180502,2000,1000,2000,Unmatch
20180503,3000,,3000,Missing
20180504,4000,4000,,Missing
一直在尝试,但没有任何工作。任何人都可以帮我解决这个问题。
解决方案
这行得通。
v=$(cat File1.csv File2.csv File2.csv | cut -d, -f1 | sort -u | sed 's/$/,/')
f() { { join -t, -v 1 - $1 <<<"$v"; cat $1; } | sort; }
join -t, <(join -t, <(f File1.csv) <(f File2.csv)) <(f File3.csv) \
| awk -F ',' '{ printf $0; if ($2 == "" || $3 == "" || $4 == "") print ",Missing"; else if ($2 == $3 && $3 == $4) print ",Match"; else print ",Unmatch"; }'
推荐阅读
- openmdao - 强制设计变量界限的最严格方法是什么?
- javascript - 递归地创建新的 Promise
- python - Python 命名空间和导入:在导入的模块中设置全局变量的值会创建第二个不相关的全局变量?
- resources - 如何根据 react-admin 上的用户权限编程配置资源和 crud 操作
- c# - 检查 NamedPipeClientStream 是否有要阅读的内容
- typescript - 为什么打字稿未定义类型的行为与可选类型不同?
- qt - 在 Ubuntu 16.04 上配置 Qt 5.9.5
- unit-testing - 模拟 context.Context 以测试 lambdacontext.FromContext
- java - Intellij IDEA:传递 java 命令参数
- sql - 事件发生时用于识别日期范围的 T-SQL 查询