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

[其他] 【已解决】gawk:如何合并2段正则表达式代码,以实现不输出中间结果的目的

本帖最后由 思想之翼 于 2023-4-24 17:00 编辑

下述2段正则表达式,代码1输出结果文本A;代码2依据结果文本A,输出结果文本B。
现在欲将这2个代码合二为一,以实现不输出结果文本A这一中间过程,而将其数值储入内存,然后调用内存数值进行运算,输出结果文本B。

代码1:替换文本数值后,输出结果文本A
字典文本
d:\HY\000001\000001_1.txt ~ 000001_7.txt
替换文本
e:\ZD\GD\000001\000001_1.txt ~ 000001_7.txt
结果文本A【实现目标:不写入7个文本,储存在内存,等待代码2调用】
e:\HY\GD\000001\000001_1.txt ~ 000001_7.txt
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /l %%f in (1000001,1,1001798) do (
  4.     set p=%%f
  5.     for /l %%g in (1,1,7) do (
  6. gawk -F"=" "ARGIND>1{if(b[$1]){a[ARGIND]=a[ARGIND]==\"\"?$2:a[ARGIND] \"\n\" $2;next}}{b[$0]++}END{for(i=2;i<=ARGIND;i++){ if(a[i]){f=ARGV[i];sub(/^d:\\HY/,\"e:\\HY\\GD\",f);print(a[i])>f}}}" "e:\ZD\GD\!p:~1!\!p:~1!_%%g.txt" d:\HY\!p:~1!\!p:~1!_%%g.txt
  7. ))
  8. exit
复制代码
代码2:合并结果文本A 000001_1.txt ~ 000001_7.txt 共7个文本,提取重复N次的字符,输出结果文本B
结果文本A【实现目标:不读入7个文本,调用代码1储存在内存的数据】
e:\HY\GD\000001\000001_1.txt ~ 000001_7.txt
结果文本B
e:\TQ\GD\000001.txt
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /l %%f in (1000001,1,1001798) do (
  4.         set p=%%f
  5. gawk "{for(i=1;i<=NF;i++)a[$i]++}END{for(i in a)if(a[i]==7)print i}" e:\HY\GD\!p:~1!\*.txt>e:\TQ\GD\!p:~1!.txt
  6. )
  7. exit
复制代码
1

评分人数

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

回复 1# 思想之翼
试一下对a ++吧  然后在最后判断次数

TOP

回复 1# 思想之翼

私信收到,但此主题已超出本人能力之极限。在此对辜负信任深表歉意 ,抱歉抱歉

TOP

本帖最后由 terse 于 2023-4-19 23:09 编辑

是不是这个意思  你替换一下试
  1. gawk -F"=" "ARGIND>1{if(b[$1]){a[ARGIND]=c[$2]++;next}}{b[$0]=1}END{for(i=2;i<=ARGIND;i++){ if(a[i]){f=ARGV[i];sub(/^d:\\HY/,\"e:\\HY\\GD\",f);for( k in c ) { if (c[k]==7) print(k)}}}}" "e:\ZD\GD\!p:~1!\!p:~1!_%%g.txt" d:\HY\!p:~1!\!p:~1!_%%g.txt
复制代码
1

评分人数

TOP

本帖最后由 思想之翼 于 2023-4-21 17:01 编辑

回复 4# terse
感谢帮助!经测试,代码没有统计替换后的7个文件中总共出现7次的字符。
简单说,是文本 1替换a,2替换b,3替换c,4替换d,5替换e,6替换f,7替换g,
然后 a+b+c+d+e+f+g,取出现7次的字符。
文本1 2 3 4 5 6 7 在D:\A\01\
文本a b c d e f g  在E:\B\01\
(文本1234567 与 文本abcdefg 同名)
取出的字符,写入F:\C\01.txt

TOP

本帖最后由 terse 于 2023-4-21 16:55 编辑

回复 5# 思想之翼
错误是指哪部分? 是输出路径有误,还是取值错误;或其他错误
下面输出应该看出是那部分错 最好发上来指出哪部分的错误
  1. gawk -F"=" "ARGIND>1{if(b[$1]){a[ARGIND]=c[$2]++;next}}{b[$0]=1}END{for(i=2;i<=ARGIND;i++){ if(a[i]){f=ARGV[i];sub(/^d:\\HY/,\"e:\\HY\\GD\",f);for( k in c ) { if (c[k]==7) print(k,f)}}}}" "e:\ZD\GD\!p:~1!\!p:~1!_%%g.txt" d:\HY\!p:~1!\!p:~1!_%%g.txt
复制代码
替换下面的试试呢
  1. gawk -F"=" "ARGIND>1{if(b[$1]){a[ARGIND,a[ARGIND]++]=$2;next}}{b[$0]=1}END{for(i=2;i<=ARGIND;i++){if(a[i]){f=ARGV[i];sub(/^d:\\HY/,\"e:\\HY\\GD\",f);for(j=0;j<a[i];j++){print(a[i,j])>f;c[a[i,j]]++}}}for(k in c)if(c[k]==7)print(k)}"  "e:\ZD\GD\!p:~1!\!p:~1!_%%g.txt" d:\HY\!p:~1!\!p:~1!_%%g.txt >F:\C\01.txt
复制代码
1

评分人数

    • 思想之翼: 感谢分享! 第2个代码结果正确。替换后的7个 ...技术 + 1

TOP

回复 4# terse


    他的要求应该是统计替换后的7个文件中总共出现7次的字符

TOP

本帖最后由 思想之翼 于 2023-4-22 17:17 编辑

回复 6# terse

感谢帮助!第2个代码结果正确。替换后的7个文本如果不写入文件夹(非先写入再删除)就完美了。因为替换7个文本,是中间过程,没必要输出,况且体积大,先输出再读入不但费时,而且徒增M.2硬盘擦洗次数。

TOP

7个文件只读取 不写入
  1. gawk -F"=" "ARGIND>1{if(b[$1]){a[ARGIND,a[ARGIND]++]=$2;next}}{b[$0]=1}END{for(i=2;i<=ARGIND;i++){if(a[i]){for(j=0;j<a[i];j++)c[a[i,j]]++}}for(k in c)if(c[k]==4)print(k)}"
复制代码
回复 8# 思想之翼
1

评分人数

TOP

还是全部放进gawk里吧,参考下面的
  1. BEGIN{
  2. for(i=1;i<1799;i++){
  3. for(j=1;j<8;j++){
  4. dictxt=sprintf("d:\\HY\\%06d\\%06d_%d.txt",i,i,j);
  5. reptxt=sprintf("e:\\ZD\\GD\\%06d\\%06d_%d.txt",i,i,j);
  6. while(getline <reptxt){
  7. split($0,sp,"=");
  8. 处理替换文本;
  9. }
  10. while(getline <dictxt){
  11. split($0,sp,"=");
  12. 处理字典文本;
  13. }}
  14. 统计并提取重复N次的字符;
  15. 打印输出;
  16. }}
复制代码
1

评分人数

TOP

回复 10# Five66
感谢帮助!参考您的思路,边学边用,捣鼓了一番不得要领,恳望您结合1#实例,给予指导。

TOP

回复 11# 思想之翼
参考下面的,直接保存成文件,然后用gawk -f 选项,例如gawk-f awk.txt
因为全放进gawk里面,其他bat代码就不需要了
注意:
没用过windows的gawk,不知道有无问题
没有处理细节,例如要处理的文件不存在时可能会无限循环
当然你也可以将代码弄成只有一行的来使用(注意特殊字符)
  1. BEGIN{
  2. for(i=1;i<1799;i++){
  3. for(j=1;j<8;j++){
  4. dictxt=sprintf("d:\\HY\\%06d\\%06d_%d.txt",i,i,j);
  5. reptxt=sprintf("e:\\ZD\\GD\\%06d\\%06d_%d.txt",i,i,j);
  6. while(getline <reptxt){
  7. b[$0]++;
  8. }
  9. while(getline <dictxt){
  10. split($0,sp,"=");
  11. if(b[sp[1]]){a[sp[2]]++;}
  12. }
  13. delete b;
  14. }
  15. outtxt=sprintf("e:\\TQ\\GD\\%06d_%d.txt",i,i);
  16. for(k in a){if(a[k]==7)print(k) >outtxt;}
  17. delete a;
  18. }}
复制代码
1

评分人数

TOP

返回列表