标题: [文本处理] 【已解决】gawk:替换多行多列字符串时,如何保留Tab空格 [打印本页]
作者: 思想之翼 时间: 2024-11-11 14:35 标题: 【已解决】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】替换后的结果?
【注】- 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
作者: Five66 时间: 2024-11-11 19:17
任意tab或空格
不知行否- 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
复制代码
作者: Five66 时间: 2024-11-11 19:25
回复 2# Five66
不用试了 ,sub()默认是正则 ,文本包含正则的特殊字符时可能会出错
作者: aloha20200628 时间: 2024-11-11 20:45
本帖最后由 aloha20200628 于 2024-11-11 20:52 编辑
回复 1# 思想之翼
假设 a.txt 为字典文件,用 sed.exe 完成全部替换并直接更新 b.txt...
以下代码适用一楼示例的两个问题- @echo off &for /f "tokens=1,2 delims==" %%a in (a.txt) do (
- sed -r -i -e "s/%%a/%%b /g" -e "s/[ ]{2,}/ /g" -e "s/[ ]+$//g" -e "s/[ ]+\t/\t/g" b.txt)
- pause&exit/b
复制代码
作者: hfxiang 时间: 2024-11-12 10:49
回复 1# 思想之翼
【问题1】- @echo off
- 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】- @echo off
- 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
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |