我有大约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
我经常进行这种处理,并且想知道下次运行时我是否可以采取任何措施来改进处理。我对任何编程语言和建议持开放态度。谢谢!
答案 0 :(得分:35)
首先,你没有使用cat
的全部力量。只需用
cat data/* > dnsFull
假设该文件最初为空。
然后就是所有那些迫使程序等待硬盘的临时文件(通常是现代计算机系统中最慢的部分)。使用管道:
cat data/* | sort | uniq > dnsOut
这仍然是浪费,因为只有sort
可以做你正在使用cat
和uniq
的内容;
sort -u data/* > dnsOut
如果这仍然不够快,那么意识到排序需要O(n lg n)时间,而重复数据删除可以使用Awk在线性时间内完成:
awk '{if (!a[$0]++) print}' data/* > dnsOut