13

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

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

4

1 回答 1

41

首先,您没有使用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
于 2013-06-01T14:30:58.510 回答