代码之家  ›  专栏  ›  技术社区  ›  Sir. Hedgehog

用awk打印最快的方法是什么

  •  0
  • Sir. Hedgehog  · 技术社区  · 10 年前

    我正在尝试进行一些测量,我想知道什么是最快的打印方式 nawk . 现在我用 printf ARR[2] " "; ,但打印似乎比正常情况下要花更多的时间。

    信息:我正在打印大约500个数字,并在 printf 这样就不会在打印出来的时候把所有东西都粘在一起了。我还在ksh上运行脚本,在unix oracle solaris中。

    像这样,打印所有内容需要大约14秒,有没有更快的方法?

    提前谢谢!

    更新

    我关心的功能是awkfun,我在其中使用 time 当我为了测量时间而调用它时。 想想 NUMBERS 作为包含1000个随机数的变量,以及 XNUMBERS 一个包含1000个随机数的变量,但采用这种格式, 123|321 ,因此它接受随机数,并添加一个 | 在中间 我正在检查每个 数字 如果它在 x个数字 如果它显示出来,我只打印出相反的数字。

    numfun() {
        NUMBERS=`nawk ' BEGIN{ 
            srand();
            for (i=0; i<=999; i++) {
                printf("%s\n", 100 + int(rand() * (899)));
            }   
        }'`
    }
    numfun
    sleep 1
    xnumfun() {
        XNUMBERS=`nawk ' BEGIN{ 
            srand();
            for (i=0; i<=999; i++) {
                XNUMBERS[i]= 100 + int(rand() * (899));
            }
            for (i=0; i<=999; i++) {
                ver=XNUMBERS[i] "";
                        rev = "";
                for (q=length(ver); q!=0; q--) {
                    rev = rev substr(ver, q, 1);
                }
                printf("%s\n", XNUMBERS[i] "|" rev );
            }
        }'`
    }
    xnumfun
    awkfun() {
        for n in $NUMBERS
        do
            echo "${XNUMBERS}" | nawk -v VAR=$n '
            {
                split($1,ARR,"|")
                if (VAR == ARR[1]){
                    printf ARR[2] " ";
                    exit;
                }
            }' 
        done
    
    }
    shellfun() {
        for n in $NUMBERS
        do
            for x in $XNUMBERS
            do
                if test "$n" -eq "${x%%\|*}"
                    then
                    echo "${x##*\|}";
                    break;
                fi
                continue;
            done
        done
    }
    sleep 1
    time awkfun;
    echo "\nAWK TIME\n\n-----------------------------";
    time shellfun;
    echo "\nSHELL TIME\n\n-----------------------------";
    time numfun;
    echo "\nNUMBERS TIME\n\n-----------------------------";
    time xnumfun;
    echo "\nXNUMBERS TIME\n\n-----------------------------\n\nTOTAL TIME\n";
    

    后果

    作为参考,对于脚本优化后的结果, AWK公司 平均实时= 0,84 , 外壳 平均实时: 0,48

    2 回复  |  直到 10 年前
        1
  •  3
  •   John Zwinck    10 年前

    程序速度慢的原因不是因为打印。您的程序很慢,因为您调用了 nawk 对于的每个元素 $NUMBERS 这是非常浪费的,你应该从一开始就重新考虑你的程序设计。看起来你主要是想看看一个列表中的哪些数字存在于另一个列表。如果要在nawk中执行此操作,应首先读取整个第一个列表,并在从第二个文件读取每个数字之前将元素存储在关联数组中。

    您可能可以使用 join grep .


    编辑:这是一个使用 格雷普 。它至少比您的原版快20倍 shellfun() .

    shellfun2() {
        echo $XNUMBERS | tr ' ' '\n' | cut -d '|' -f1 \
            | grep -f <(echo $NUMBERS | tr ' ' '\n') | rev
    }
    

    它的工作方式是从 $XNUMBERS 在管道之前(所以 12|21 34|43 成为 12\n34 ),然后用管道将其输送至 格雷普 使用 -f 论点是所有 $个数字 。这意味着我们要搜索 $x个数字 在内部 $个数字 ,打印匹配项后,我们只需使用 rev 反转它们。我们不需要 $x个数字 总之(因此,您甚至可以一开始就停止生成它们,从而节省更多时间)。


    编辑:既然你现在告诉我们你是在Solaris而不是Linux上运行,你就没有 版本 ,以便您可以替换 版本 在上述内容中:

    sed '/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//'
    

    您可以替换 格雷普 具有 /usr/xpg4/bin/grep 以获得支持 -f个 .

        2
  •  2
  •   Cwissy    10 年前

    您将以$NUMBERS为单位为每个数字启动nawk,就时间而言非常昂贵。

    你可以过滤 $NUMBERS grep只处理您感兴趣的数字。即

    grep -f FileWithListOfNumbers FileWithListOfXnumbers >matched_numbers
    

    将为您提供一个XNUMBERS列表(以matched_nnumbers为单位),该列表也以NUMBER为单位