0

给定 2 个包含 N 个数字的文件,例如

文件 1

1 0.001
2 0.002
3 0.002
4 0.005
5 0.007
6 0.008
7 0.008
8 0.009
9 0.0010
0 0.011

并且 file2 只是 file1 的洗牌版本:

0 0.011
8 0.009
7 0.008
3 0.002
5 0.007
9 0.0010
1 0.001
4 0.005
2 0.002
6 0.008

我想计算两个连续数字的顺序,但在这种情况下,如果在 file1.dat 的第二列中有两个相同的连续数字(对于 2-3 和 6-7 的情况),我会像这样我们直接将反转计为 0.5,而不查看 file2.dat。在这种情况下,结果将是 4 次反转。一个类似的问题(和答案)是关于计算文件中两个连续数字的顺序在 BASH 中的第二个文件中颠倒的次数

4

1 回答 1

1

我做了两个案例,选择一个你需要的:

这是计算 0.5 或 1 个案例结果 =4

kent$  awk  'FNR==NR{o[NR]=$1;next;}{v[$1]=FNR;m[$1]=$2;n=FNR}                               
        END{ for(i=1;i<=n-1;i++) { t+=m[o[i]]==m[o[i+1]]?0.5:v[o[i]]>v[o[i+1]]?1:0};                                                                                        
                print "invertions:"t;    
        }' f1 f2
invertions:4

这是添加额外的 0.5 案例结果 = 6

kent$  awk  'FNR==NR{o[NR]=$1;next;}{v[$1]=FNR;m[$1]=$2;n=FNR}
        END{ for(i=1;i<=n-1;i++) {t1+=(v[o[i]]>v[o[i+1]])?1:0; t2+=m[o[i]]==m[o[i+1]]?0.5:0};
                print "invertions:"t1+t2;
        }' f1 f2
invertions:6
于 2013-02-08T10:14:04.577 回答