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

[文本处理] 【已解决】批处理如何合并左侧同类相,且同类相右侧数值求和?

文本记录数值如下所示,如何用纯批或gawk等第三方工具,合并左侧的同类相,且同类相右侧的数值求和?
331        2
445        1
550        3
653        1000
567        1
331        20
550        3333
567        1
653        19999

结果为:
331        22
445        1
550        3336
653        20999
567        2
1

评分人数

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

  1. @echo off
  2. for /f "useback tokens=1-2" %%a in ("1.txt") do (
  3. set /a #%%a + = %%b
  4. )
  5. setlocal enabledelayedexpansion
  6. (for /f "useback tokens=1-2" %%a in ("1.txt") do (
  7. if not defined _%%a (
  8. echo %%a !#%%a!
  9. set _%%a=1
  10. )
  11. ))>2.txt
  12. endlocal
  13. pause
复制代码
1

评分人数

bat小白,请多指教!谢谢!

TOP

本帖最后由 思想之翼 于 2023-7-12 21:50 编辑

回复 2# 77七
感谢!

TOP

回复 1# 思想之翼
  1. gawk "{a[$1]+=$2}END{for(i in a)print i,a[i]}" 1.txt > 2.txt
复制代码
1

评分人数

我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

本帖最后由 qixiaobin0715 于 2023-7-13 16:27 编辑
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. (for /f "tokens=1,2" %%i in ('sort 1.txt') do (
  4.     if %%i equ !str! (
  5.         set /a n+=%%j
  6.     ) else (
  7.         if defined n echo,!str! !n!
  8.         set n=%%j
  9.         set str=%%i
  10.     )
  11. )
  12. echo,!str! !n!)>2.txt
  13. pause
复制代码
这样可以解决变量设置过多而引起的超限发生。
1

评分人数

TOP

  1. @if(0)==(0) echo off
  2. type 1.txt | cscript //nologo //e:jscript "%~f0" > 2.txt
  3. pause & exit /b
  4. @end
  5. var str = WSH.StdIn.ReadAll();
  6. var reg = /^(\S+)[ \t]+(\d+)/mg;
  7. var obj = {}
  8. while (arr = reg.exec(str)) {
  9.     var key = arr[1];
  10.     var value = 1 * arr[2];
  11.     obj[key] = obj.hasOwnProperty(key) ? obj[key] + value : value;
  12. }
  13.         
  14. for (var key in obj) WSH.Echo(key + ' ' + obj[key]);
复制代码
1

评分人数

TOP

本帖最后由 WHY 于 2023-7-13 11:47 编辑
  1. PowerShell "gc 1.txt | group{($_ -split '\s+')[0]} | forEach{$_.Name + ' ' + ($_.Group -replace '^\S+' | measure -Sum).Sum}" > 2.txt
复制代码
1

评分人数

TOP

Test.ps1
  1. $arrIn  = [IO.File]::ReadAllLines('1.txt') -match '^\S+\s+\d+';
  2. $arrOut = [Collections.ArrayList]@();
  3. $dict   = New-Object 'System.Collections.Generic.Dictionary[string, Int]';
  4. for ($i = 0; $i -lt $arrIn.Count; $i++) {
  5.     $arr = $arrIn[$i] -split '\s+';
  6.     $key = $arr[0];
  7.     $value = 1 * $arr[1];
  8.     $dict[$key] += $value;
  9. }
  10. forEach ($key In $dict.Keys) {
  11.     [void]$arrOut.Add($key + ' ' + $dict[$key]);
  12. }
  13. [IO.File]::WriteAllLines('2.txt', $arrOut);
复制代码
1

评分人数

TOP

返回列表