bash - 比较 2 个 csv 文件并将常用字段记录合并到第一个文件中
问题描述
我正在尝试编写一个 shell 脚本/bash 命令,它将使用 csv 中的第三个字段(以 91 开头)比较 2 个 csv 文件,第一个文件有数百万条记录,第二个文件,一个较小的文件有数千个数据。如果通过比较第一个文件中的第三个字段在第二个文件中找到匹配项,则第二个文件中的匹配记录(较小的一个)应替换第一个文件中的记录或创建一个第三个文件,该文件将具有来自第二个文件的匹配记录替换第一个文件中的匹配记录。
我正在尝试这样的事情,但没有给出所需的输出: grep -v -f file2.csv file1.csv
CSV 文件 1:
0,104673081,91623178295,false,2019-03-21 03:31:04,2019-03-24 13:18:03
0,104673361,91678296502,false,2019-03-21 03:35:35,2019-05-22 21:55:50
0,104679130,**91661560977**,false,2019-03-21 03:36:37,2019-03-21 03:37:00
0,104674082,91691721155,false,2019-03-21 03:49:07,2019-06-21 08:13:00
CSV 文件 2:
0,104673063,91623178427,false,2019-03-21 03:31:04,2019-03-24 13:18:03
0,104673321,91678296913,false,2019-03-21 03:35:35,2019-05-22 21:55:50
0,104679111,**91661560977**,false,2019-03-21 03:36:37,2019-03-21 04:34:00
预期输出:
文件 1(通过比较第 3 个字段来匹配来自第 2 个文件的记录,即来自第 2 个文件的 91661560977 已替换第 1 个文件中的记录)
0,104673081,91623178295,false,2019-03-21 03:31:04,2019-03-24 13:18:03
0,104673361,91678296502,false,2019-03-21 03:35:35,2019-05-22 21:55:50
0,104679111,**91661560977**,false,2019-03-21 03:36:37,2019-03-21 04:34:00
0,104674082,91691721155,false,2019-03-21 03:49:07,2019-06-21 08:13:00
解决方案
像这样的东西,也许?:
$ awk -F, 'NR==FNR{a[$3]=$0;next}$3 in a{$0=a[$3]}1' file2 file1
输出:
0,104673081,91623178295,false,2019-03-21 03:31:04,2019-03-24 13:18:03
0,104673361,91678296502,false,2019-03-21 03:35:35,2019-05-22 21:55:50
0,104679111,**91661560977**,false,2019-03-21 03:36:37,2019-03-21 04:34:00
0,104674082,91691721155,false,2019-03-21 03:49:07,2019-06-21 08:13:00
解释:
$ awk -F, ' # comma delimiter
NR==FNR { # process first file, ie. file2
a[$3]=$0 # hash record, $3 is the key NOTICE NEEDS TO BE UNIQUE
next # process next record
}
$3 in a { # process second file, if matching $3 found in both files
$0=a[$3] # replace record with the one from file2
}1' file2 file1 # output. mind the file order to hash the smaller fie
如果您还想转储其余部分file2
:
$ awk -F, 'NR==FNR{a[$3]=$0;next}$3 in a{$0=a[$3];delete a[$3]}1; END{for(i in a)print a[i]}' file2 file1
推荐阅读
- python - 对 Tmax 和 Tmin 的区域进行着色
- javascript - 基于数据库条目的动态 express.js 路由,无需重新启动
- python - 在迭代调用的函数中存储和加载参数的有效方法
- optaplanner - 将自动连线 SolverManager 与 Optaplanner 一起使用时,如何访问 scoreDirector?
- django - 在 django 中使用 pytest 和 mock 获取状态码
- c# - 如何在 asp.net 核心中获得博客帖子看到访问者?
- postgresql - Postgres 何时以及如何使用“transactionid”锁
- sql - 更新上个月喜欢的商品
- javascript - 在 php MVC 上使用 ajax 请求
- webpack - npm run dev 不会自动刷新最新更改