Board logo

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

作者: 思想之翼    时间: 2023-9-8 12:20     标题: 【已解决】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
作者: hfxiang    时间: 2023-9-8 13:53

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

作者: qixiaobin0715    时间: 2023-9-8 14:41

尝试用纯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
复制代码

作者: 思想之翼    时间: 2023-9-8 15:08

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

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

回复 4# 思想之翼


    具体超过几行可以重现这个问题?
作者: hfxiang    时间: 2023-9-8 16:12

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





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