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

[文本处理] 【已解决】gawk:统计文本中特定字符的个数,据此统计另一文本中具有同样个数的字符

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

D:\DATA\1.txt 记录字符:
中国 中国 中国 美国
欧盟 法国 法国 德国

D:\DATA\2.txt 记录字符:
中国 美国 美国
法国 法国 法国 法国
英国 德国 美国 德国
中国 中国

如何使用gawk工具,先统计 1.txt 中特定字符“中国”的出现次数N,上例N=3,(特定字符“中国”预先写入代码,而非在代码运行过程中弹出页面手动输入),
据此,统计 2.txt 中出现次数N=3的字符,上例N=3的字符为 中国 美国,写入D:\DATA\3.txt

最终输出结果
3.txt
中国 美国




【注】下列代码,统计 1.txt 2.txt 字符出现次数:
  1. gawk -v"RS=\r?\n| " "{++a[$0][FILENAME];f[FILENAME]}END{PROCINFO["sorted_in"]="@ind_str_desc";for(i in a)for(j in f)if(!a[i][j]){};for(i in a){printf i;s=1;for(j in a[i]){sId=s?":":",";printf sId" %s 记录 %d 次",j,a[i][j];s=0}print""}}" 1.txt 2.txt>3.txt
复制代码
3.txt结果:
中国: 2.txt 记录 3 次, 1.txt 记录 3 次
英国: 2.txt 记录 1 次, 1.txt 记录 0 次
欧盟: 2.txt 记录 0 次, 1.txt 记录 1 次
美国: 2.txt 记录 3 次, 1.txt 记录 1 次
法国: 2.txt 记录 4 次, 1.txt 记录 2 次
德国: 2.txt 记录 2 次, 1.txt 记录 1 次

评分

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

查看全部评分

发表于 2024-12-5 18:43:24 | 显示全部楼层
本帖最后由 aloha20200628 于 2024-12-5 18:47 编辑

回复 1# 思想之翼

快递一个 bat+gawk 版本,用 gawk.exe v4.1.3版测试通过...

  1. @echo off &cd /d "d:\data" &setlocal &set "c=中国"
  2. for /f %%n in (
  3.   'awk "{c+=gsub(/%c%/,"﹢")}END{print c}" 1.txt') do (for /f "delims=" %%a in (
  4.   'awk "FNR==1{No++}{for(i=0;i++<NF;)a[No][$i]=1}END{for(i in a)for(k in a[i])if(++d[k]==No)print k}" 1.txt 2.txt'
  5. ) do for /f %%v in (
  6.   'awk "{c+=gsub(/%%a/,"﹢")}END{print c}" 2.txt') do if %%v equ %%n set/p="%%a "<nul)>3.txt
  7. endlocal&pause&exit/b
复制代码

评分

参与人数 1技术 +1 收起 理由
思想之翼 + 1 感谢! 结果正确

查看全部评分

发表于 2024-12-5 18:57:07 | 显示全部楼层
回复 1# 思想之翼

  1. gawk -v"RS=\r?\n| " -v"s=中国" "NR==FNR{if($0==s)n++;next}{++a[$0]}END{for(i in a)if(a[i]==n)printf"%s ",i}" 1.txt 2.txt>3.txt
复制代码

评分

参与人数 1技术 +1 收起 理由
思想之翼 + 1 感谢分享,速度快捷,结果正确

查看全部评分

发表于 2024-12-5 19:26:22 | 显示全部楼层
直接读取1楼代码生成的3.txt来判断次数

  1. gawk -v"N=3" -F"[ :]" "{if($5==N){a=$1" ";printf(a)}}" 3.txt >3.3.txt
  2. move /y 3.3.txt 3.txt
复制代码

评分

参与人数 1技术 +1 收起 理由
思想之翼 + 1 学习了

查看全部评分

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

本版积分规则

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

GMT+8, 2026-3-17 13:11 , Processed in 0.012666 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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