Board logo

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

作者: 思想之翼    时间: 2023-7-12 17:59     标题: 【已解决】批处理如何合并左侧同类相,且同类相右侧数值求和?

文本记录数值如下所示,如何用纯批或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
作者: 77七    时间: 2023-7-12 21:03

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

作者: 思想之翼    时间: 2023-7-12 21:47

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

回复 2# 77七
感谢!
作者: Batcher    时间: 2023-7-12 22:38

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

作者: qixiaobin0715    时间: 2023-7-13 08:31

本帖最后由 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
复制代码
这样可以解决变量设置过多而引起的超限发生。
作者: WHY    时间: 2023-7-13 11:12

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

作者: WHY    时间: 2023-7-13 11:14

本帖最后由 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
复制代码

作者: WHY    时间: 2023-7-13 11:16

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





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