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

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

[复制链接]
发表于 2023-7-12 17:59:04 | 显示全部楼层 |阅读模式
文本记录数值如下所示,如何用纯批或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

评分

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

查看全部评分

发表于 2023-7-12 21:03:14 | 显示全部楼层
  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技术 +1 收起 理由
思想之翼 + 1 乐于助人

查看全部评分

 楼主| 发表于 2023-7-12 21:47:38 | 显示全部楼层
本帖最后由 思想之翼 于 2023-7-12 21:50 编辑

回复 2# 77七
感谢!
发表于 2023-7-12 22:38:32 | 显示全部楼层
回复 1# 思想之翼
  1. gawk "{a[$1]+=$2}END{for(i in a)print i,a[i]}" 1.txt > 2.txt
复制代码

评分

参与人数 1技术 +1 收起 理由
思想之翼 + 1 乐于助人

查看全部评分

发表于 2023-7-13 08:31:33 | 显示全部楼层
本帖最后由 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技术 +1 收起 理由
思想之翼 + 1 感谢分享

查看全部评分

发表于 2023-7-13 11:12:03 | 显示全部楼层
  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技术 +1 收起 理由
思想之翼 + 1 乐于助人

查看全部评分

发表于 2023-7-13 11:14:19 | 显示全部楼层
本帖最后由 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技术 +1 收起 理由
思想之翼 + 1 感谢分享

查看全部评分

发表于 2023-7-13 11:16:13 | 显示全部楼层
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技术 +1 收起 理由
思想之翼 + 1 乐于助人

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-18 17:08 , Processed in 0.010643 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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