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

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

本帖最后由 思想之翼 于 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
1

评分人数

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

回复 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

评分人数

TOP

尝试用纯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

评分人数

TOP

本帖最后由 思想之翼 于 2023-9-8 16:06 编辑

回复 2# hfxiang
感谢!经测试,结果正确。
只是有个问题不解:测试文件(UTF-8)超过一定行数,结果为乱码(变成 UTF-16 LE),何因?
3# 纯批也是这种状况。

TOP

回复 4# 思想之翼


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

TOP

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

TOP

返回列表