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

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

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

评分人数

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

直接读取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

评分人数

TOP

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

TOP

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

评分人数

TOP

返回列表