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

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

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

评分人数

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

任意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

评分人数

TOP

回复 2# Five66


    不用试了 ,sub()默认是正则 ,文本包含正则的特殊字符时可能会出错

TOP

本帖最后由 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

评分人数

TOP

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

评分人数

TOP

返回列表