Board logo

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

作者: 思想之翼    时间: 2024-12-5 17:26     标题: 【已解决】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 次
作者: aloha20200628    时间: 2024-12-5 18:43

本帖最后由 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
复制代码

作者: hfxiang    时间: 2024-12-5 18:57

回复 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
复制代码

作者: Five66    时间: 2024-12-5 19:26

直接读取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
复制代码





欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2