两个 CSV 文件的比较
Comparison of two CSV files
我正在尝试使用 Awk 比较两个大型 CSV 文件(每个文件超过 5000 行)的内容,但我无法得到我想要的结果。
这是我的问题:
我有第一个文件 (File1),其中包含名称 ($1) 和城市 ($2) 的列表,其结构如下所示:
john;london
marc;paris
karen;new york
ben;london
vic;dublin
我有第二个文件 (File2),其中包含其他信息,我们在其中找到了 File1 的一些名称 ($3):
45456;windows;john;454646
47764;mac;zack;470093
41225;mac;ben;622101
12634;windows;ben;218996
7856;windows;karen;637294
12;mac;finn;878317
2315;windows;beverly;221167
445;windows;lilly;12316
3232;mac;john;601316
4546;mac;fish;305035
487;windows;vic;447421
46464;mac;karen;468154
我想从 File2 中提取其名称出现在 File1 中的所有行,同时添加与 File1 中每个名称关联的城市。这是我正在寻找的结果的示例:
45456;windows;john;454646;london
3232;mac;john;601316;london
7856;windows;karen;637294;new york
46464;mac;karen;468154;new york
41225;mac;ben;622101;london
12634;windows;ben;218996;london
487;windows;vic;447421;dublin
你能帮帮我吗?
构建第一个文件的关联数组,将名称作为索引,将城市作为值。对于第二个文件,检查数组中是否包含名称特征,如果是,则打印该行并附上城市。
awk -F';' 'NR==FNR{a[]=} in a{print [=10=]";"a[]}' File1 File2
45456;windows;john;454646;london
41225;mac;ben;622101;london
12634;windows;ben;218996;london
7856;windows;karen;637294;new york
3232;mac;john;601316;london
487;windows;vic;447421;dublin
46464;mac;karen;468154;new york
与 bash
、GNU sort
和 GNU join
:
join -t ';' -1 1 -2 3 <(sort File1) <(sort -t ';' -k 3 File2) -o 2.1,2.2,1.1,2.4,1.2
输出:
12634;windows;ben;218996;london
41225;mac;ben;622101;london
45456;windows;john;454646;london
3232;mac;john;601316;london
46464;mac;karen;468154;new york
7856;windows;karen;637294;new york
487;windows;vic;447421;dublin
使用csvkit
csvjoin -d ';' -H -c 3,1 File2 File1 | csvformat -D ';' | tail -n +2
我正在尝试使用 Awk 比较两个大型 CSV 文件(每个文件超过 5000 行)的内容,但我无法得到我想要的结果。
这是我的问题:
我有第一个文件 (File1),其中包含名称 ($1) 和城市 ($2) 的列表,其结构如下所示:
john;london
marc;paris
karen;new york
ben;london
vic;dublin
我有第二个文件 (File2),其中包含其他信息,我们在其中找到了 File1 的一些名称 ($3):
45456;windows;john;454646
47764;mac;zack;470093
41225;mac;ben;622101
12634;windows;ben;218996
7856;windows;karen;637294
12;mac;finn;878317
2315;windows;beverly;221167
445;windows;lilly;12316
3232;mac;john;601316
4546;mac;fish;305035
487;windows;vic;447421
46464;mac;karen;468154
我想从 File2 中提取其名称出现在 File1 中的所有行,同时添加与 File1 中每个名称关联的城市。这是我正在寻找的结果的示例:
45456;windows;john;454646;london
3232;mac;john;601316;london
7856;windows;karen;637294;new york
46464;mac;karen;468154;new york
41225;mac;ben;622101;london
12634;windows;ben;218996;london
487;windows;vic;447421;dublin
你能帮帮我吗?
构建第一个文件的关联数组,将名称作为索引,将城市作为值。对于第二个文件,检查数组中是否包含名称特征,如果是,则打印该行并附上城市。
awk -F';' 'NR==FNR{a[]=} in a{print [=10=]";"a[]}' File1 File2
45456;windows;john;454646;london
41225;mac;ben;622101;london
12634;windows;ben;218996;london
7856;windows;karen;637294;new york
3232;mac;john;601316;london
487;windows;vic;447421;dublin
46464;mac;karen;468154;new york
与 bash
、GNU sort
和 GNU join
:
join -t ';' -1 1 -2 3 <(sort File1) <(sort -t ';' -k 3 File2) -o 2.1,2.2,1.1,2.4,1.2
输出:
12634;windows;ben;218996;london 41225;mac;ben;622101;london 45456;windows;john;454646;london 3232;mac;john;601316;london 46464;mac;karen;468154;new york 7856;windows;karen;637294;new york 487;windows;vic;447421;dublin
使用csvkit
csvjoin -d ';' -H -c 3,1 File2 File1 | csvformat -D ';' | tail -n +2