【问题标题】:combine multiple text files and remove duplicates合并多个文本文件并删除重复项
【发布时间】:2013-05-28 05:48:40
【问题描述】:

我有大约 350 个文本文件(每个文件大约 75MB)。我正在尝试合并所有文件并删除重复的条目。文件格式如下:

ip1,dns1
ip2,dns2
...

我写了一个小shell脚本来做这个

#!/bin/bash
for file in data/*
do
    cat "$file" >> dnsFull
done
sort dnsFull > dnsSorted
uniq dnsSorted dnsOut
rm dnsFull dnsSorted

我经常进行此处理,并且想知道下次运行它时是否可以做些什么来改进处理。我对任何编程语言和建议持开放态度。谢谢!

【问题讨论】:

  • 你也可以给 sort -ma try --> 它将对单个文件进行排序并相应地合并它们,因此应该节省相当多的时间...... -m 选项可用于场景 espl像这样...即排序 -m 文件* | uniq -u

标签: shell unix text merge duplicate-removal


【解决方案1】:

首先,您没有使用cat 的全部功能。循环可以替换为只是

cat data/* > dnsFull

假设文件最初是空的。

然后是所有那些迫使程序等待硬盘的临时文件(通常是现代计算机系统中最慢的部分)。使用管道:

cat data/* | sort | uniq > dnsOut

这仍然很浪费,因为仅sort 就可以完成您使用catuniq 的工作;整个脚本可以替换为

sort -u data/* > dnsOut

如果这还不够快,那么请意识到排序需要 O(n lg n) 时间,而使用 Awk 可以在线性时间内完成重复数据删除:

awk '{if (!a[$0]++) print}' data/* > dnsOut

【讨论】:

  • 注意最后的awk可以简化为awk '!a[$0]++' data/*
  • 我删除了我的 perl 答案,因为 350 * 75MB = 超过 26GB - 内存中排序(如 awk)会导致过多的内存交换。
  • 抱歉,awk '!a[$0]++' 是做什么的?它是比较第一个元素还是整行?
  • 在我的情况下,使用 awk 在“线性时间”中进行重复数据删除总是耗尽内存。不知何故 sort -u 完成了这项工作。
猜你喜欢
  • 1970-01-01
  • 2012-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-09
  • 2021-12-08
相关资源
最近更新 更多