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

[文本处理] 【已解决】gawk:如何处理四个字符的排列组合问题

本帖最后由 思想之翼 于 2025-3-14 14:52 编辑

请教:如何用三方工具 gawk 处理四个字符的排列组合问题?排列组合后,删重 与 不删重,这两种情况烦请分别给出一个代码。

比如:2345这四个字符的排列组合数有4×3×2×1=24个,分别是:5234、5243、5324、5342、5432、5423、2534、2543、2354、2345、2453、2435、3524、3542、3245、3254、3425、3452、4325、4352、4235、4253、4523、4532。

如果不删除重复数据,0000这个数据的四个位置,可以当作四个字符,其排列组合数同样有24个。

现在 Z:\DATA\内有文本 A.txt,只记录1行数据,近1万个字符,其格式如下:
2345(空格)0000(空格)2345(空格)
(没有换行符)

按照上述方式,A.txt 内每个数字的四个位置,当作四个字符,进行排列组合,不删除重复数据,可以得到24*3=72个数字。

排列组合后,结果文本 B.txt 的数据格式与 A.txt 相同:
2345(空格)0000(空格)2345(空格)......2345(空格)
(没有换行符)
1

评分人数

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

是这样子不??
不删除重复
  1. gawk "function comb(m,n,c,s,end,i,t,j,k){for(i=c;i<=m;i++){t=s\"\"B[i];if(length(t)==n){split(t,A,/./,C);k=1;for(j in C)A[C[j]]++;for(j in A){if(A[j]>1)k=0};if(k){u++;str=str\"\"t}}else{comb(m,n,c,t)}}}BEGIN{n=4;for(i=1;i<=n;i++)B[i]=i}{comb(n,n,1,\"\");split(str,A,/./,T);for(i=1;i<=NF;i++){split($i,A,/./,S);for(R in T){x++;v=v\"\"S[T[R]];if(x==n){printf(v\" \");x=0;v=\"\"}}}}" A.txt >B.txt
复制代码
1

评分人数

TOP

本帖最后由 思想之翼 于 2025-3-14 06:26 编辑
是这样子不??
不删除重复
Five66 发表于 2025-3-13 23:29
我试写了个删重的,报错,烦请不吝指教!
  1. gawk "function permute(a,s,e,    i,t){if(s==e){k=a[1]a[2]a[3]a[4];u[k]=1}else{for(i=s;i<=e;i++){t=a[s];a[s]=a[i];a[i]=t;permute(a,s+1,e);t=a[s];a[s]=a[i];a[i]=t}}}{r=\"\";for(i=1;i<=NF;i++){split($i,c,\"\");delete u;permute(c,1,4);s=\"\";n=asorti(u,v);for(j=1;j<=n;j++)s=s?s\" \"v[j]:v[j];r=r?r\" \"s:s}END{printf \"%%s\",r}" "Z:\排列组合\A.txt" >"Z:\排列组合\B.txt"
复制代码

TOP

回复 3# 思想之翼


    闭合错误 ,END前面加个右花括号 }

TOP

删除重复的 ,拼接放到2楼代码 >b.txt前面
  1. |gawk -v"n=24" "{for(i=1;i<=NF;i++){A[$i]++;c++;if(c==n){for(j in A)printf(j\" \");c=0;delete A}}}"
复制代码
1

评分人数

TOP

返回列表