linux – 没有重复的排列列
发布时间:2020-12-13 23:02:31 所属栏目:Linux 来源:网络整理
导读:任何人都可以给我一些代码或算法或其他东西来解决以下问题吗? 我有几个文件,每个文件都有不同的列数,例如: $ cat file-1 1 2$ cat file-21 2 3$ cat file-31 2 3 4 我想减去列绝对值,并除以每个不同列的一行中所有的总和一次(没有重复列对的组合): in fil
任何人都可以给我一些代码或算法或其他东西来解决以下问题吗?
我有几个文件,每个文件都有不同的列数,例如: $> cat file-1 1 2 $> cat file-2 1 2 3 $> cat file-3 1 2 3 4 我想减去列绝对值,并除以每个不同列的一行中所有的总和一次(没有重复列对的组合): in file-1 case I need to get: 0.3333 # because |1-2/(1+2)| in file-2 case I need to get: 0.1666 0.1666 0.3333 # because |1-2/(1+2+3)| and |2-3/(1+2+3)| and |1-3/(1+2+3)| in file-3 case I need to get: 0.1 0.2 0.3 0.1 0.2 0.1 # because |1-2/(1+2+3+4)| and |1-3/(1+2+3+4)| and |1-4/(1+2+3+4)| and |2-3/(1+2+3+4)| and |2-4/(1+2+3+4)| and |3-4/(1+2+3+4)| 解决方法
这应该工作,虽然我猜你在输入数据中犯了一个小错误.根据您的第三种模式,以下数据应为 –
代替: in file-2 case I need to get: 0.1666 0.1666 0.3333 # because |1-2/(1+2+3)| and |2-3/(1+2+3)| and |1-3/(1+2+3)| 它应该是: in file-2 case I need to get: 0.1666 0.3333 0.1666 # because |1-2/(1+2+3)| and |1-3/(1+2+3)| and |2-3/(1+2+3)| 这是awk one liner: awk ' NF{ a=0; for(i=1;i<=NF;i++) a+=$i; for(j=1;j<=NF;j++) { for(k=j;k<NF;k++) printf("%s ",-($j-$(k+1))/a) } print ""; next; }1' file 精简版: awk ' NF{for (i=1;i<=NF;i++) a+=$i; for (j=1;j<=NF;j++){for (k=j;k<NF;k++) printf("%2.4f ",-($j-$(k+1))/a)} print "";a=0;next;}1' file 输入文件: [jaypal:~/Temp] cat file 1 2 1 2 3 1 2 3 4 测试: [jaypal:~/Temp] awk ' NF{ a=0; for(i=1;i<=NF;i++) a+=$i; for(j=1;j<=NF;j++) { for(k=j;k<NF;k++) printf("%s ",-($j-$(k+1))/a) } print ""; next; }1' file 0.333333 0.166667 0.333333 0.166667 0.1 0.2 0.3 0.1 0.2 0.1 从较短版本测试: [jaypal:~/Temp] awk ' NF{for (i=1;i<=NF;i++) a+=$i; for (j=1;j<=NF;j++){for (k=j;k<NF;k++) printf("%2.4f ",-($j-$(k+1))/a)} print "";a=0;next;}1' file 0.3333 0.1667 0.3333 0.1667 0.1000 0.2000 0.3000 0.1000 0.2000 0.1000 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |