Board logo

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

作者: 每天几分    时间: 2023-3-29 18:50     标题: 【已解决】大文件,批处理如何对重复列添加增量序号。

本帖最后由 每天几分 于 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万词不到就崩溃了。
多谢楼下各位!
作者: 77七    时间: 2023-3-29 19:33

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


写着玩的,可以运行几分钟,看看效率如何吗?
作者: buyiyang    时间: 2023-3-29 20:16

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

作者: hfxiang    时间: 2023-3-29 20:30

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

作者: xp3000    时间: 2023-3-29 20:38

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

作者: czjt1234    时间: 2023-3-29 20:48

10万甚至百万级别的数据,估计4楼的gawk速度最快
作者: xczxczxcz    时间: 2023-3-29 22:25

偶试了一下 PS 也很快哦!未缓存的。11万行

作者: 77七    时间: 2023-3-29 23:10

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

回复 6# czjt1234

我把楼主的提供的样本,复制到了98万行
测试 2楼代码用时 6分钟左右;把重定向写到外面 是2分钟左右 (我太外行了...以为数据太大,该写到里面);
测试 3楼代码用时 5分钟左右;
测试 4楼代码用时 几秒;
测试 5楼代码用时 20秒左右。
作者: WHY    时间: 2023-3-30 22:47

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





欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2