You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

含带引号字段与嵌入逗号的CSV去重及sort工具使用咨询

处理5GB大型CSV文件的第二列去重问题

背景

我有个5GB左右的大型CSV文件,部分内容示例如下:

"8976897","this is the abstract text of, some document, and can pretty much contain anything"
"23423","this is the subject text of, some document, and can pretty much contain anything"
"23","this is the full text of, some document, and can pretty much contain anything"
"3443","this is the subject text of, some document, and can pretty much contain anything"

发现第二列有大量重复内容,想去掉这些重复项。之前试过sort -u infile > outfile,看着好像有用,但文件太大没法验证——而且我没指定只针对第二列操作。现在问三个问题:

  1. sort是干这个活的正确工具吗?
  2. 怎么让sort只针对第二列操作?
  3. 用-u参数时,sort是找整个文件里的重复项,还是只找相邻行的重复?

解答

1. sort是不是正确工具?

能用来完成任务,但不是最优解。sort要先对整个文件做全量排序,5GB的文件排序时IO和内存开销都不小。如果你的需求只是保留第二列唯一的行,用awk更高效——它只需要遍历一次文件,记录已经出现过的第二列内容即可,不用全量排序。

但如果你的场景本来就需要排序后的结果,或者不在乎效率,sort也能搞定。

2. 让sort只针对第二列操作的方法

注意你的CSV第二列内部包含逗号,不能直接用逗号当分隔符。得用双引号作为字段分隔符,指定排序和去重的目标字段:

sort -t '"' -k4,4 -u infile > outfile

参数拆解:

  • -t '"':将双引号设置为字段分隔符
  • -k4,4:指定以第4个字段作为排序和去重的依据(每行结构是"ID","内容",按双引号拆分后,字段依次是空、ID、空、内容、空,所以目标内容是第4个字段)
  • -u:基于指定字段去除重复项

不过这个方法要求CSV格式严格和示例一致,要是有格式混乱的行可能会出错。

3. sort -u的去重范围

sort -u会先对整个文件完成排序,然后去掉所有重复的行(基于你指定的排序键),不是只去除相邻行的重复。它会把所有相同键值的行合并为一行,最终输出的是整个文件中基于指定键的唯一行。

更高效的替代方案(推荐)

用awk处理,无需排序,一次遍历即可完成,内存开销仅取决于第二列的唯一值数量,比sort更适合大文件:

awk -F'"' '{if (!seen[$4]++) print}' infile > outfile

解释:

  • -F'"':用双引号作为字段分隔符
  • seen[$4]:用数组seen记录第4个字段(即第二列内容)是否已经出现过
  • !seen[$4]++:当该字段首次出现时,打印整行;之后标记为已出现,再遇到就跳过

内容的提问来源于stack exchange,提问作者JohnJ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 11:46:02