合并多个文本文件并删除重复项

时间:2013-06-01 14:22:05

标签: shell unix text merge duplicate-removal

我有大约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

我经常进行这种处理,并且想知道下次运行时我是否可以采取任何措施来改进处理。我对任何编程语言和建议持开放态度。谢谢!

1 个答案:

答案 0 :(得分:35)

首先,你没有使用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