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

标签 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

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

最佳答案

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

关于shell - 合并多个文本文件并删除重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16873669/

相关文章:

bash - 使用 bash 脚本将文本文件一分为二

android - Android 是否支持 HUP 信号生成/处理?

shell - 错误 : site default-ssl not properly enabled

python - 如何检测无响应/卡住的进程?

python - 我想根据特定的单词来划分文件,并且根据这个单词我想要上面的行,然后放入newfile.txt

c# - C# 和 regex101 之间的正则表达式结果不同

shell - 运行 Hbase shell 时出错

regex - 奇怪的 sed 行为

linux - 为什么我不能运行我的 shell 脚本来列出用户?

Node.js Mongoose 不以纯文本形式存储连接字符串