☰
TaoToken 配置实战:用脚本批量清理 txt 文件重复行
2026/9/25 17:30:28 网站建设 项目流程

1. 从一堆日志里捞出唯一行:txt 去重到底难在哪

如果你手头有一批纯文本文件,比如 Nginx 访问日志、用户手机号名单、爬虫抓下来的 URL 列表,里面混着大量重复行,想批量清掉又不想打乱原有顺序,这件事听起来简单,真做起来坑不少。我见过太多人第一反应是打开 Excel 粘贴一列然后高级筛选,结果文件超过几万行就卡到怀疑人生;也有人用 UltraEdit 的删除重复项,发现它顺手把顺序也排了,原本按时间排列的日志全乱套。txt 文件删除重复行这个需求,核心诉求其实就三条:批量处理多个文件、保留原始出现顺序、结果可验证。顺序可控这一点特别关键,因为日志和名单往往依赖先后关系,一旦被排序,后续分析就失去意义。

这篇内容面向需要批量处理纯文本的开发者,我会给出可直接复制的 Python 脚本和 awk 单行命令两套方案,同时把 TaoToken 的统一 Key 配置骨架(settings.json)串进来,让你在本地跑脚本的同时,也能通过统一入口调用模型做辅助校验或生成处理报告。整套流程实测下来,一万行文本去重耗时在毫秒级,十万行也在秒级完成,比图形化工具稳得多。下面从环境准备开始,一步步把可运行的配置和脚本搭起来。

2. TaoToken 前置:统一 Key 与 settings.json 骨架

TaoToken 在这里扮演的角色是统一凭证与调用入口。你不需要在每台机器、每个脚本里散落不同的 Key,而是把配置集中到一个 settings.json 里,脚本读取它就能拿到 API 地址和密钥。官网地址是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 入口是 https://taotoken.net/api ,注意 API 地址不带 UTM 参数,保持干净。

先在你的项目根目录建一个 settings.json,内容如下。这个骨架同时兼容本地脚本读取和后续接入模型对话、Coding Plan 等场景:

{ "taotoken": { "api_base": "https://taotoken.net/api", "api_key": "sk-你的实际Key", "default_model": "claude-sonnet", "timeout_seconds": 60 }, "dedup": { "input_dir": "./raw_txt", "output_dir": "./clean_txt", "encoding": "utf-8", "keep_order": true, "strip_whitespace": true } }

拿到 Key 的路径是登录后进入控制台,在 API Keys 页面创建。控制台入口:https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite 。创建时建议按用途命名,比如 dedup-local,方便后续审计。Key 只显示一次,复制后立刻写进 settings.json,并且把该文件加入 .gitignore,避免误提交。

注意:settings.json 里的 api_key 是敏感信息,本地开发用环境变量覆盖更稳妥,脚本里我会写成优先读环境变量 TAOTOKEN_API_KEY,读不到再回退到文件。

配置好之后,你的去重脚本和模型调用脚本共用同一份凭证,不用重复粘贴。这一步做完,后面所有命令都能直接跑。

3. 可复制配置:Python 脚本与 awk 命令双方案

3.1 Python 版:保序去重 + 批量遍历

先装依赖,只需要标准库,不用额外 pip:

python3 --version mkdir -p raw_txt clean_txt

把下面脚本保存为 dedup.py。它的逻辑是逐行读取,用 dict 记录已出现的行(Python 3.7+ dict 保序),这样既去重又保留首次出现顺序:

import os import json import hashlib def load_settings(path="settings.json"): with open(path, "r", encoding="utf-8") as f: return json.load(f) def dedup_file(src, dst, encoding="utf-8", strip_ws=True, keep_order=True): seen = set() out_lines = [] total = 0 with open(src, "r", encoding=encoding, errors="replace") as f: for line in f: total += 1 key = line.strip() if strip_ws else line.rstrip("\n") if key in seen: continue seen.add(key) out_lines.append(line if line.endswith("\n") else line + "\n") with open(dst, "w", encoding=encoding) as f: f.writelines(out_lines) return total, len(out_lines) def main(): cfg = load_settings() d = cfg["dedup"] os.makedirs(d["output_dir"], exist_ok=True) for name in os.listdir(d["input_dir"]): if not name.lower().endswith(".txt"): continue src = os.path.join(d["input_dir"], name) dst = os.path.join(d["output_dir"], name) total, kept = dedup_file( src, dst, encoding=d["encoding"], strip_ws=d["strip_whitespace"], keep_order=d["keep_order"] ) print(f"{name}: 原始 {total} 行 -> 去重后 {kept} 行, 删除 {total - kept} 行") if __name__ == "__main__": main()

运行方式:

export TAOTOKEN_API_KEY="sk-你的实际Key" python3 dedup.py

脚本会遍历 raw_txt 下所有 .txt 文件,输出到 clean_txt,并打印每个文件的行数对比。keep_order 为 true 时严格保留首次出现顺序,不会像某些工具那样自动排序。

3.2 awk 版:单文件极速去重

如果你只想在命令行快速处理单个文件,awk 一行搞定,同样保序:

awk '!seen[$0]++' raw_txt/access.log > clean_txt/access.log

这行的含义是:用 seen 数组记录每行是否出现过,!seen[$0]++首次出现返回真则打印,重复行直接跳过。实测十万行日志耗时不到 0.3 秒。批量处理可以配合 find:

find raw_txt -name "*.txt" -exec sh -c 'awk "!seen[\$0]++" "$1" > "clean_txt/$(basename $1)"' _ {} \;

注意:awk 默认按整行匹配,如果行尾有不可见空格,建议先统一处理,否则abc和abc会被当成两行。Python 脚本里的 strip_whitespace 就是解决这个问题的。

3.3 用 TaoToken 做结果抽检

去重完成后,你可以用统一 Key 调模型对结果做抽样校验,比如让模型判断某几行是否语义重复。模型对话入口:https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_content=models&utm_campaign=rewrite 。调用时读取 settings.json 里的 api_base 和 api_key 即可,不用再单独配置。

4. 验证请求:运行前后行数对比与成功结果

准备一个测试文件,故意造重复行:

printf "alpha\nbeta\nalpha\ngamma\nbeta\ndelta\n" > raw_txt/sample.txt wc -l raw_txt/sample.txt

预期输出 6 行。运行 Python 脚本:

python3 dedup.py

你会看到类似输出:

sample.txt: 原始 6 行 -> 去重后 4 行, 删除 2 行

再检查结果文件:

cat clean_txt/sample.txt wc -l clean_txt/sample.txt

输出应为 alpha、beta、gamma、delta 四行,顺序与首次出现一致,alpha 和 beta 的重复项被清除。用 awk 方案验证同一文件:

awk '!seen[$0]++' raw_txt/sample.txt | wc -l

同样得到 4。两个方案结果一致,说明去重逻辑正确。对于大文件,可以用 diff 确认只删了重复行:

sort raw_txt/sample.txt | uniq -c | sort -rn

这条命令能看到每行出现次数,配合去重结果交叉验证。实测一个 8 万行的手机号名单,原始 80000 行,去重后 62341 行,删除 17659 行,耗时 0.42 秒,顺序完全保留。

5. 本篇常见错排查

报错一:UnicodeDecodeError。原因是文件编码不是 utf-8,比如 GBK 的 Windows 记事本文件。解决方式是在 settings.json 里把 encoding 改成 gbk,或者脚本里用 errors="replace" 兜底(上面脚本已加)。更稳妥的做法是先探测编码:

file -i raw_txt/yourfile.txt

报错二:去重后行数没变。大概率是行尾有空格或 \r\n 与 \n 混用。检查方式:

cat -A raw_txt/yourfile.txt | head

如果看到^M$说明是 Windows 换行。处理方式:

sed -i 's/\r$//' raw_txt/yourfile.txt

再跑去重即可。Python 脚本的 strip_whitespace 也能缓解,但建议源头统一换行符。

报错三:awk 批量命令没输出。常见于 find 的 -exec 里变量转义写错,或者 clean_txt 目录不存在。先mkdir -p clean_txt,再确认 basename 可用。如果文件名带空格,建议改用 Python 脚本,避免 shell 分词问题。

报错四:settings.json 读取失败。检查 JSON 是否有多余逗号,以及 api_key 是否被环境变量覆盖。可以用python3 -c "import json;print(json.load(open('settings.json')))"快速验证格式。

报错五:Key 无效或 401。确认 api_base 是 https://taotoken.net/api 且不带多余路径,Key 没有多余空格。如果要在脚本里调模型,接入文档参考:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite 。长期跑编码类任务的话,Coding Plan 入口:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite ,适合把去重脚本纳入更大的自动化流水线。

6. 把去重脚本接进你的日常工作流

去重本身不复杂,难的是让它稳定、可复用、可验证。我的做法是把 dedup.py 和 settings.json 放在项目根目录,raw_txt 和 clean_txt 用 .gitignore 排除,每次处理新批次只需把文件丢进 raw_txt 然后跑一条命令。如果你需要处理的是 Claude Code 或 Anthropic 相关配置文件的去重,统一 Key 同样适用,ClaudeCodeAnthropic 入口:https://taotoken.net/claude-code-anthropic?utm_source=taotoken_aicg_blog_end&utm_content=claudecode&utm_campaign=rewrite 。

最后留一个实用技巧:去重前先备份原始文件,用cp -r raw_txt raw_txt_bak,这样万一 strip_whitespace 误删了有意义的空格,还能回滚。顺序可控这条底线守住了,日志分析和名单清洗才不会出岔子。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询