首页 > 解决方案 > 以格式不正确的 csv 打印所有重复项

问题描述

我有一个巨大的 csv 文件(~17GB),我需要创建一个新文件,其中包含最后一列的值多次出现的所有行,不幸的是,文件格式不正确。有些值包含逗号,如下例中的第 6 行:

entity,entity_type,component_id
bla@gmail.com,email,1111
lalal@hotmail.com,email,2222
15158112233,phone,3333
15158990000,phone,2222
hello,world@gmail.com,email,3333
1327168,phone,4444
fds_213445,device,3333

对于以下示例,我希望这个新文件:

lalal@hotmail.com,email,2222
15158990000,phone,2222
15158112233,phone,3333
hello,world@gmail.com,email,3333
fds_213445,device,3333

我目前使用一个天真的解决方案:

  1. 计算每个组件的大小并存储在文件 A 中。
  2. 从文件 A 中删除大小 = 1 的所有组件。
  3. 在文件 A 中的所有 component_id 上运行脚本,将原始文件中的匹配行打印到新的结果文件中。

但是,正如我所说,这个解决方案非常幼稚,并且运行了很长时间(几乎一个星期并且仍在运行......)

如何以有效的方式创建包含所有带有 component_id 的行的新文件在 bash 中多次出现?

标签: csvawk

解决方案


awk和两个通过文件?第一个计算最后一个字段的出现次数,第二个仅打印重复项。

awk -F, 'FNR == NR { ids[$NF]++; next }
         ids[$NF] > 1 || FNR == 1' hugefile.csv hugefile.csv > newfile.csv

推荐阅读