首页 > 解决方案 > 比较 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

标签: bashshellcsvawk

解决方案


像这样的东西,也许?:

$ 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

推荐阅读