微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

linux – 没有重复的排列列

任何人都可以给我一些代码或算法或其他东西来解决以下问题吗?
我有几个文件,每个文件都有不同的列数,例如:

$> 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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐