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

[文本处理] 【已解决】gawk:替换多行多列字符串时,如何保留Tab空格

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

A.txt数值格式如下:
书=203 203
生=504 504
气=705

B.txt数值格式如下:
书 生        气
生        气 书
气        书        生

【问题1】:如何用gawk等第三方工具,将A.txt作为字典,替换B.txt的数值,且保留Tab空格?
替换后,B.txt的数值格式为:
203 203 504 504        705
504 504        705 203 203
705        203 203        504 504

【问题2】:如果B.txt数值格式,仅有Tab空格,没有其他空格:
书生        气
生        气书
气        书        生
如何用gawk等第三方工具,实现【问题1】替换后的结果?

【注】
  1. gawk -F"=" "NR==FNR{A[$1]=$2;next}{split($0,B,"");c=length(B);for (i=1;i<=c;i++) printf(i<c?"%%s":"%%s\n",A[B[i]])}" A.txt B.txt >C.txt
复制代码
上述代码,不论B.txt数值有无空格,是啥空格,替换后的数值格式都为:
203 203 504 504 705
504 504 705 203 203
705 203 203 504 504

评分

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

查看全部评分

发表于 2024-11-11 19:17:01 | 显示全部楼层
任意tab或空格
不知行否

  1. gawk -F"=" "ARGIND==1{A[$1]=$2;next};{v=gensub(/([\t ]+)/,"\\1\n\n","g",$0);split(v,B,/\n\n/);c=length(B);for(i=1;i<=c;i++){s=B[i];l=B[i];sub(/[\t ]+/,"",s);sub(s,A[s],l);printf(i<c?"%%s":"%%s\n",l)}}" A.txt B.txt >C.txt
复制代码

评分

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

查看全部评分

发表于 2024-11-11 19:25:33 | 显示全部楼层
回复 2# Five66


    不用试了 ,sub()默认是正则 ,文本包含正则的特殊字符时可能会出错
发表于 2024-11-11 20:45:12 | 显示全部楼层
本帖最后由 aloha20200628 于 2024-11-11 20:52 编辑

回复 1# 思想之翼

假设 a.txt 为字典文件,用 sed.exe 完成全部替换并直接更新 b.txt...
以下代码适用一楼示例的两个问题

  1. @echo off &for /f "tokens=1,2 delims==" %%a in (a.txt) do (
  2.    sed -r -i -e "s/%%a/%%b /g" -e "s/[ ]{2,}/ /g" -e "s/[ ]+$//g" -e "s/[ ]+\t/\t/g" b.txt)
  3. pause&exit/b
复制代码

评分

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

查看全部评分

发表于 2024-11-12 10:49:48 | 显示全部楼层
回复 1# 思想之翼

【问题1】

  1. @echo off
  2. gawk -F"=" "NR==FNR{A[$1]=$2;next}{c=split($0,B,/[ \t]+/,m);for(i=1;i<=c;i++)printf("%%s%%s",A[B[i]],m[i]);print A[B[i+1]]}" A.txt B.txt >C.txt
复制代码
【问题2】

  1. @echo off
  2. gawk -F"=" -v"tab=\t" "BEGIN{A["\t"]="\t"}NR==FNR{A[$1]=$2;next}{c=split($0,B,//);printf A[B[1]];t1=A[B[i]];for(i=2;i<=c;i++){((A[B[i]]~tab)||(t1~tab))?t=1:t=0;printf(t?"%%s":" %%s",A[B[i]]);t1=A[B[i]]};print ""}" A.txt B.txt >C.txt
复制代码

评分

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

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-17 14:23 , Processed in 0.012128 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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