[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

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

本帖最后由 每天几分 于 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万词不到就崩溃了。
多谢楼下各位!
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

  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

评分人数

    • 每天几分: 虽然效率不及4楼的,但还是多谢,辛苦了。技术 + 1
bat小白,请多指教!谢谢!

TOP

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"
复制代码

TOP

回复 1# 每天几分
请把文件1.txt保存为ANSI编码
  1. gawk "{$1=$1(++a[$1]);print $1\"        \"$2}" 1.txt>2.txt
复制代码
1

评分人数

    • 每天几分: 这个很好用,几秒就搞定了,多谢技术 + 1

TOP

  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

评分人数

TOP

10万甚至百万级别的数据,估计4楼的gawk速度最快

QQ 20147578

TOP

偶试了一下 PS 也很快哦!未缓存的。11万行
QQ: 己阵亡
脚本优先 [PowerShell win10]

TOP

本帖最后由 77七 于 2023-3-29 23:17 编辑

回复 6# czjt1234

我把楼主的提供的样本,复制到了98万行
测试 2楼代码用时 6分钟左右;把重定向写到外面 是2分钟左右 (我太外行了...以为数据太大,该写到里面);
测试 3楼代码用时 5分钟左右;
测试 4楼代码用时 几秒;
测试 5楼代码用时 20秒左右。
bat小白,请多指教!谢谢!

TOP

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');
复制代码

TOP

返回列表