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

[文本处理] 【已解决】gawk:多列数据如何合并同类项

[复制链接]
发表于 2023-9-8 12:20:24 | 显示全部楼层 |阅读模式
本帖最后由 思想之翼 于 2023-9-8 14:04 编辑

a.txt 记录数值如下(等号左侧数值不重复,等号右侧数值只有一列):
000=00
001=01
002=01
003=02
004=03
合并等号右侧同类项,同时合并等号左侧数值,结果 b.txt 为:
00=000
01=001 002
02=003
03=004

【解决方案】:
  1. gawk -F"=" "{a[$2]=a[$2]?a[$2]" "$1:$1}END{for (id in a)print id FS a[id]}" a.txt>b.txt
复制代码
【问题】:若文件等号右侧数值有多列,如何合并等号右侧同类项,同时合并等号左侧数值?

例如:a.txt 记录数值如下(等号左侧数值不重复,等号右侧数值有多列):
000=00 04 99
001=01 05 06 03
002=01
003=02 04
004=03 99
合并等号右侧同类项,结果 b.txt 为:
00=000
01=001 002
02=003
03=001 004
04=000 003
05=001
06=001
99=000 004

评分

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

查看全部评分

发表于 2023-9-8 13:53:25 | 显示全部楼层
回复 1# 思想之翼

  1. gawk -F"[= ]+" "NF>1{for(i=2;i<=NF;i++)a[$i]=a[$i]?a[$i]" "$1:$1""}END{for(i=1;i<=asorti(a,b);i++)print b[i]"="a[b[i]]}" a.txt>b.txt
复制代码

评分

参与人数 1技术 +1 收起 理由
思想之翼 + 1 感谢分享

查看全部评分

发表于 2023-9-8 14:41:32 | 显示全部楼层
尝试用纯P试试,不需评分:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "tokens=1-2 delims==" %%i in (a.txt) do (
  4. for %%k in (%%j) do set _%%k=!_%%k! %%i
  5. )
  6. (for /f "tokens=1* delims=_ " %%i in ('set _') do echo,%%i%%j)>b.txt
  7. pause
复制代码

评分

参与人数 1技术 +1 收起 理由
思想之翼 + 1 学习了

查看全部评分

 楼主| 发表于 2023-9-8 15:08:09 | 显示全部楼层
本帖最后由 思想之翼 于 2023-9-8 16:06 编辑

回复 2# hfxiang
感谢!经测试,结果正确。
只是有个问题不解:测试文件(UTF-8)超过一定行数,结果为乱码(变成 UTF-16 LE),何因?
3# 纯批也是这种状况。
发表于 2023-9-8 16:09:08 | 显示全部楼层
回复 4# 思想之翼


    具体超过几行可以重现这个问题?
发表于 2023-9-8 16:12:38 | 显示全部楼层
回复 4# 思想之翼
可尝试输出为Unix格式(加参数:-v"BINMODE=w"),多数情况下能避免乱码

  1. gawk -v"BINMODE=w" -F"[= ]+" "NF>1{for(i=2;i<=NF;i++)a[$i]=a[$i]?a[$i]" "$1:$1""}END{for(i=1;i<=asorti(a,b);i++)print b[i]"="a[b[i]]}" a.txt>b.txt
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-18 13:18 , Processed in 0.020746 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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