标题: [文本处理] 【已解决】批处理如何合并左侧同类相,且同类相右侧数值求和? [打印本页]
作者: 思想之翼 时间: 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
- @echo off
- for /f "useback tokens=1-2" %%a in ("1.txt") do (
- set /a #%%a + = %%b
- )
- setlocal enabledelayedexpansion
- (for /f "useback tokens=1-2" %%a in ("1.txt") do (
- if not defined _%%a (
- echo %%a !#%%a!
- set _%%a=1
- )
- ))>2.txt
- endlocal
- pause
复制代码
作者: 思想之翼 时间: 2023-7-12 21:47
本帖最后由 思想之翼 于 2023-7-12 21:50 编辑
回复 2# 77七
感谢!
作者: Batcher 时间: 2023-7-12 22:38
回复 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 编辑
- @echo off
- setlocal enabledelayedexpansion
- (for /f "tokens=1,2" %%i in ('sort 1.txt') do (
- if %%i equ !str! (
- set /a n+=%%j
- ) else (
- if defined n echo,!str! !n!
- set n=%%j
- set str=%%i
- )
- )
- echo,!str! !n!)>2.txt
- pause
复制代码
这样可以解决变量设置过多而引起的超限发生。
作者: WHY 时间: 2023-7-13 11:12
- @if(0)==(0) echo off
- type 1.txt | cscript //nologo //e:jscript "%~f0" > 2.txt
- pause & exit /b
- @end
-
- var str = WSH.StdIn.ReadAll();
- var reg = /^(\S+)[ \t]+(\d+)/mg;
- var obj = {}
-
- while (arr = reg.exec(str)) {
- var key = arr[1];
- var value = 1 * arr[2];
- obj[key] = obj.hasOwnProperty(key) ? obj[key] + value : value;
- }
-
- for (var key in obj) WSH.Echo(key + ' ' + obj[key]);
复制代码
作者: WHY 时间: 2023-7-13 11:14
本帖最后由 WHY 于 2023-7-13 11:47 编辑
- 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- $arrIn = [IO.File]::ReadAllLines('1.txt') -match '^\S+\s+\d+';
- $arrOut = [Collections.ArrayList]@();
- $dict = New-Object 'System.Collections.Generic.Dictionary[string, Int]';
-
- for ($i = 0; $i -lt $arrIn.Count; $i++) {
- $arr = $arrIn[$i] -split '\s+';
- $key = $arr[0];
- $value = 1 * $arr[1];
- $dict[$key] += $value;
- }
-
- forEach ($key In $dict.Keys) {
- [void]$arrOut.Add($key + ' ' + $dict[$key]);
- }
-
- [IO.File]::WriteAllLines('2.txt', $arrOut);
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |