ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

TaoToken 配置实战:用脚本批量清理 txt 文件重复行

TaoToken 配置实战:用脚本批量清理 txt 文件重复行 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_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_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_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 。创建时建议按用途命名比如 dedup-local方便后续审计。Key 只显示一次复制后立刻写进 settings.json并且把该文件加入 .gitignore避免误提交。注意settings.json 里的 api_key 是敏感信息本地开发用环境变量覆盖更稳妥脚本里我会写成优先读环境变量 TAOTOKEN_API_KEY读不到再回退到文件。配置好之后你的去重脚本和模型调用脚本共用同一份凭证不用重复粘贴。这一步做完后面所有命令都能直接跑。3. 可复制配置Python 脚本与 awk 命令双方案3.1 Python 版保序去重 批量遍历先装依赖只需要标准库不用额外 pippython3 --version mkdir -p raw_txt clean_txt把下面脚本保存为 dedup.py。它的逻辑是逐行读取用 dict 记录已出现的行Python 3.7 dict 保序这样既去重又保留首次出现顺序import os import json import hashlib def load_settings(pathsettings.json): with open(path, r, encodingutf-8) as f: return json.load(f) def dedup_file(src, dst, encodingutf-8, strip_wsTrue, keep_orderTrue): seen set() out_lines [] total 0 with open(src, r, encodingencoding, errorsreplace) 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, encodingencoding) 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_okTrue) 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, encodingd[encoding], strip_wsd[strip_whitespace], keep_orderd[keep_order] ) print(f{name}: 原始 {total} 行 - 去重后 {kept} 行, 删除 {total - kept} 行) if __name__ __main__: main()运行方式export TAOTOKEN_API_KEYsk-你的实际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 秒。批量处理可以配合 findfind 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_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 。调用时读取 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或者脚本里用 errorsreplace 兜底上面脚本已加。更稳妥的做法是先探测编码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_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。长期跑编码类任务的话Coding Plan 入口https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 适合把去重脚本纳入更大的自动化流水线。6. 把去重脚本接进你的日常工作流去重本身不复杂难的是让它稳定、可复用、可验证。我的做法是把 dedup.py 和 settings.json 放在项目根目录raw_txt 和 clean_txt 用 .gitignore 排除每次处理新批次只需把文件丢进 raw_txt 然后跑一条命令。如果你需要处理的是 Claude Code 或 Anthropic 相关配置文件的去重统一 Key 同样适用ClaudeCodeAnthropic 入口https://taotoken.net/claude-code-anthropic?utm_sourcetaotoken_aicg_blog_endutm_contentclaudecodeutm_campaignrewrite 。最后留一个实用技巧去重前先备份原始文件用cp -r raw_txt raw_txt_bak这样万一 strip_whitespace 误删了有意义的空格还能回滚。顺序可控这条底线守住了日志分析和名单清洗才不会出岔子。
返回列表