找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 22964|回复: 8

[文件操作] 【已解决】大文件,批处理如何对重复列添加增量序号。

[复制链接]
发表于 2023-3-29 18:50:07 | 显示全部楼层 |阅读模式
本帖最后由 每天几分 于 2023-3-29 21:36 编辑

如:
women        我们
tashi        他是
bucuo        不错
women        我闷
tashi        踏实
keng        可能
women        握闷
……

字母列遇到重复就在后面添加增量序号,不重复就默认添加1。

实现:
women1        我们
tashi1        他是
bucuo1        不错
women2        我闷
tashi2        踏实
keng1        可能
women3        握闷
……

试了用Excel 的=A1&COUNTIF($A$1:A1,A1)也能做到,但太慢了,10万词不到就崩溃了。
多谢楼下各位!

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2023-3-29 19:33:52 | 显示全部楼层
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "tokens=1*" %%a in (1.txt) do (
  4.         set /a #%%a+=1
  5.         >>2.txt echo %%a!#%%a! %%b
  6. )
  7. endlocal
  8. pause
复制代码


写着玩的,可以运行几分钟,看看效率如何吗?

评分

参与人数 1技术 +1 收起 理由
每天几分 + 1 虽然效率不及4楼的,但还是多谢,辛苦了。

查看全部评分

发表于 2023-3-29 20:16:09 | 显示全部楼层
ps1
  1. $content = Get-Content -Path "1.txt" -Raw
  2. $count = @{}
  3. $content -split '\r?\n' | ForEach-Object {
  4.     $line = $_
  5.     Select-String -InputObject $line -Pattern "\b[a-zA-Z]+\b" -AllMatches | ForEach-Object {
  6.         $match = $_.Matches[0]
  7.         $word = $match.Value
  8.         if ($count.ContainsKey($word)) {
  9.             $count[$word]++
  10.         } else {
  11.             $count[$word] = 1
  12.         }
  13.         $line = $line.Replace($word, "$word" + $count[$word].ToString())
  14.     }
  15.     $line
  16. } | Out-File -FilePath "2.txt"
复制代码
发表于 2023-3-29 20:30:29 | 显示全部楼层
回复 1# 每天几分
请把文件1.txt保存为ANSI编码

  1. gawk "{$1=$1(++a[$1]);print $1"        "$2}" 1.txt>2.txt
复制代码

评分

参与人数 1技术 +1 收起 理由
每天几分 + 1 这个很好用,几秒就搞定了,多谢

查看全部评分

发表于 2023-3-29 20:38:45 | 显示全部楼层
  1. @if(0)==(0) echo off
  2. rem 保存为ANSI编码的BAT文件
  3. dir /b *.txt|cscript -nologo -e:jscript "%~0"
  4. pause & exit/b
  5. @end
  6. fso = new ActiveXObject("Scripting.FileSystemObject");
  7. var f = WSH.StdIn.ReadLine();
  8. var Name = f.match(/^(^.+)\.[^\r\n]+/)[1];
  9. var inFile = fso.OpenTextFile(f, 1, false);
  10. var outFile = fso.CreateTextFile(Name + ".log", true);
  11. var dict = {};

  12. while (!inFile.AtEndOfStream) {
  13.   var line = inFile.ReadLine();
  14.   var parts = line.split(/\s+/);
  15.   var key = parts[0];
  16.   var value = parts[1];
  17.   
  18.   if (dict[key] === undefined) {
  19.     dict[key] = 1;
  20.   } else {
  21.     dict[key]++;
  22.   }
  23.   
  24.   var newLine = key + dict[key] + "\t" + value;
  25.   outFile.WriteLine(newLine);
  26. }
  27. inFile.Close();
  28. outFile.Close();
复制代码

评分

参与人数 1技术 +1 收起 理由
每天几分 + 1 感谢分享

查看全部评分

发表于 2023-3-29 20:48:30 | 显示全部楼层
10万甚至百万级别的数据,估计4楼的gawk速度最快
发表于 2023-3-29 22:25:39 | 显示全部楼层
偶试了一下 PS 也很快哦!未缓存的。11万行
发表于 2023-3-29 23:10:29 | 显示全部楼层
本帖最后由 77七 于 2023-3-29 23:17 编辑

回复 6# czjt1234

我把楼主的提供的样本,复制到了98万行
测试 2楼代码用时 6分钟左右;把重定向写到外面 是2分钟左右 (我太外行了...以为数据太大,该写到里面);
测试 3楼代码用时 5分钟左右;
测试 4楼代码用时 几秒;
测试 5楼代码用时 20秒左右。
发表于 2023-3-30 22:47:57 | 显示全部楼层
Test.js
  1. var srcFile = '1.txt';
  2. var dstFile = '2.txt';

  3. var obj = {}
  4. var fso = new ActiveXObject('Scripting.FileSystemObject');
  5. var str = fso.OpenTextFile(srcFile, 1).ReadAll();
  6. str = str.replace(
  7.     /^[a-z]+\b/mig,
  8.     function(s){
  9.         if( !obj.hasOwnProperty(s) ) obj[s] = 1;
  10.         return s + obj[s]++;
  11.     }
  12. );

  13. fso.OpenTextFile(dstFile, 2, true).Write(str);
  14. WSH.Echo('Done');
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-18 23:43 , Processed in 0.032334 second(s), 15 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表