1

我有以下情况:

我有一个仅包含数字的 1 列数据文件。让我们称之为file.dat

然后我必须洗牌这个文件,为此我在终端中编写以下代码shufl file1.dat > shuffle.dat。然后我想计算两个连续数字的顺序file1.datshuffle.dat. 我使用了代码

awk -F, 'FNR==NR{o[NR]=$0;next;}{v[$0]=FNR;n=FNR}
    END{ for(i=1;i<=n-1;i++) t+=v[o[i]]>v[o[i+1]]?1:0;
            print t;
    }' file.dat shuffle.dat

我必须重复此操作 10,000 次并将结果收集到文件中result.dat。显然,由于时间原因,通过终端进行操作是不可想象的。是否可以编写一个 awk 脚本使其重复 10,000 次操作并将结果写入输出文件result.dat?如果是的话,我如何以及如何通过终端运行脚本?

4

1 回答 1

2

一个简单的 bash 脚本将实现这一点:

echo 'FNR==NR{o[NR]=$0;next;}{v[$0]=FNR;n=FNR}
     END{for(i=1;i<=n-1;i++) t+=v[o[i]]>v[o[i+1]]?1:0;
     print t;
     }' > script.awk

touch result.dat

for i in {1..10000}; do
    echo 'shuffling file...'
    shuf file.dat > shuf.dat
    echo 'counting inversions...'
    awk -F, -f script.awk file.dat shuf.dat >> result.dat
done
于 2013-01-19T15:34:42.853 回答