首页 > 解决方案 > 如何在单独的文件中显示来自 awk rand() 循环的每个结果?

问题描述

我正在尝试使用 awk 生成几个带有随机列的文件。然后将每两个粘贴到一个包含两列的文件中。这将是另一个程序的输入。我面临的问题是我只在一个文件中获得最后一次迭代。我正在使用的代码是:

awk 'BEGIN {
srand();
total=5;
max1=10;
count=0;
    while(count < total) {
    rnd1 = int(rand() * max1);
    if ( array[rnd1] == 0 ) {
        count++;
        array[rnd1]++;
    }
}

for ( i=0; i<=200; i++) {
    if ( array[i] )
        print i;
}
}' > out1

awk 'BEGIN {
srand();
total=5;
max2=20;
count=0;
    while(count < total) {
    rnd2 = int(rand() * max2);
    if ( array[rnd2] == 0 ) {
        count++;
        array[rnd2]++;
    }

}

for ( j=0; j<=max2; j++) {
    if ( array[j] )
        print j;
}
}' > out2

paste out1 out2 | awk '{ print "  "$1".0" , $2".0"; }' > out3

有没有更好的方法将所有迭代放在单独的文件中?

我得到的输出是:

  1.0 2.0
  3.0 7.0
  4.0 9.0
  6.0 12.0
  9.0 13.0

这很好,但它在一个文件“out3”中,我想获取所有迭代文件“out(i)”文件。

标签: loopsawk

解决方案


使用重定向到文件>将删除文件的内容。改为使用>>,并按照文档获取更多帮助。

打印项目>>输出文件

此重定向将项目打印到名为 output-file 的预先存在的输出文件中。这个和单-'>'的区别 重定向是输出文件的旧内容(如果有)不会被删除。而是将 awk 输出附加到文件中。如果输出文件不存在,则创建它。

例如:

for ( i=0; i<=200; i++) {
    if ( array[i] )
        print i;
}
}' > out1

out1在每次迭代时擦除 的内容。只有最后一次迭代将被实际保存out1而不会被覆盖。


推荐阅读