将awk命令行转换为awk文件

时间:2014-05-07 21:37:31

标签: awk

这有效:

awk -F2 '{if (NF > 1) { if (substr($1,0,2) == "..") printf ("%.2f 2%s", ((50*length($1))/1000) , $2); else printf("%s2%s",$1,$2); for (i=3;i<=NF;i++) printf("2%s",$i) } else if (substr($1,0,2) == "..") printf("%.2f",((50*length($1))/1000)); else printf("%s",$1); printf("\n");}'-f debugconsole > debugconsoleWithCount 

但是当我按如下方式生成文件countdots.awk时:

BEGIN {
    if (NF > 1) 
    { 
        if (substr($1,0,2) == "..") 
            printf ("%.2f 2%s", ((50*length($1))/1000) , $2);
        else 
            printf("%s2%s",$1,$2)
        for (i=3;i<=NF;i++) 
            printf("2%s",$i) 
    } 
    else 
        if (substr($1,0,2) == "..") 
        printf("%.2f",((50*length($1))/1000)); 
    else printf("%s",$1); 
        printf("\n");
}

然后像这样运行:

awk -F2 -f countdots4.awk debugconsole > debugconsoleWithCount

我得到一个空的debugconsoleWithCount文件。

2 个答案:

答案 0 :(得分:4)

awk中的 BEGIN 块仅在执行时执行,读取第一个输入记录之前执行。

END 规则仅执行一次 后执行所有输入。

在转换过程中,由于您将所有内容都放在BEGIN块中,因此NF$1$2等的值不会变为无操作甚至设定。因此你得到一个空文件。如果你删除它应该工作正常。

BEGINEND块不是必需的,因此您无需将它们保留在awk脚本中。 BEGIN通常用于打印标题,标题,将变量初始化为特定值等。END块通常用于在读取整个输入后进行最终处理。

答案 1 :(得分:0)

基本上这与不了解BEGIN和END有关。

我拿出了BEGIN,它做了我想做的事。

我应该从stackoverflow中删除它吗?让我知道。