【问题标题】:Parsing errors in awk blocksawk 块中的解析错误
【发布时间】:2012-06-26 14:24:02
【问题描述】:
awk 'BEGIN 
    { 
    INPUTFILE ='XXX'; iterator =0;
    requestIterator =0;
    storageFlag =T;
    printFlag =F;
    currentIteration =F;
    recordCount =1;
       while (getline < "'"$INPUTFILE"'") 
       { 
             requestArray[requestIterator]++; 
             requestIterator++;
       }
     } 
     if ($1 ~ /RequestId/) 
     {  
            FS = "="; 
            if($2 in requestArray) 
            {
                  storage[iterator] =$0;
                  printFlag =T;
                  next
            }
            else 
            {
                  storageFlag =F;
                  next
            }
      }
      else 
      {
           if((storageFlag =='T' && $0 != "EOE"))   
           {
                storage[iterator]=$0; iterator++;
           } 
           else {if(storageFlag == 'F')
           {
                next
           } 
           else
           {
               if(printFlag == 'T')
               {
                    for(details in storage) 
               {
                    print storage[details] >> FILE1;
                    delete storage[details];
               } 
               printFlag =F;
               storageFlag =T;
               next
           }
     }'

我在上面的代码中遇到了一些语法错误。请大家帮帮我好吗?

awk: BEGIN{INPUTFILE =XXXX;iterator =0;requestIterator =0;storageFlag =T;printFlag =F;currentIteration =F;recordCount =1;while (getline > XXXX;删除存储[详细];}printFlag = F;storageFlag =T;下一个}}}}

awk: ^ 语法错误

awk: ^ 语法错误

【问题讨论】:

  • 您对变量FT 的使用可能不像您预期​​的那样工作。使用 0 表示 false,使用 1 表示 true,或者在 BEGIN 块中明确定义它们。另请注意,'T' 与未引用的T 完全不同(但'T'"T"awk 中是等效的)。
  • 同时更改FS mid-script 的值可能不会达到您的预期。完成RequestId 处理后,您需要将其重置为原始值。
  • 您正在定义 INPUTFILE 但从未使用它,而是用相同的名称插入一个 shell 变量(我猜这是未定义的)。如果你只使用一次,为什么你想要一个变量中的值呢?只需使用getline&lt;"XXX" 就可以了。
  • 我已经清除了所有错误,我现在得到的唯一错误是语法错误..我不知道为什么
  • 我应该使用这样的语句 if((storageFlag =='T' && $0 != "EOE"))

标签: awk


【解决方案1】:

引号是问题所在。 INPUTFILE ='XXX' 上的第一个单引号将被解析为匹配 BEGIN 之前的单引号,然后所有解析都被破坏。

要么转义引号,要么将 awk 文件放入单独的文件中,而不是“内联”。

# STARTING POINT - known bad
awk 'BEGIN { INPUTFILE ='XXX'; iterator =0; ... '

必须重写以删除外部对内的所有单引号

 awk 'BEGIN { INPUTFILE ="XXX"; iterator =0; ... '

或者根据你需要双打还是单打,在外面使用双打,在里面使用单打

awk "BEGIN { INPUTFILE ='XXX'; iterator =0; ... '

或转义单引号,以便它们通过 awk 而不会被 shell 消耗。

awk 'BEGIN { INPUTFILE =\'XXX\'; iterator =0; ... '

如果您将 awk 脚本放入一个单独的文件而不是将其内联到 shell 中,那么您的所有问题都会消失。你可以有任何你喜欢的报价,没有人会在意!!

【讨论】:

  • 感谢您的回复。如果我用双引号而不是单引号,或者我什至没有加引号会怎样?
  • 你的 awk 脚本中有单打和双打,所以你使用的任何引用都是“错误的”,除非你转义它们。我将用更多信息编辑我的答案...
  • 一目了然,您似乎可以在整个脚本中用双引号代替单引号。
  • 我已经清除了这个错误,现在我收到了一个语法错误,我通过编辑问题显示了这个错误
  • 剥离它的一部分以缩小错误范围。对我来说,这有点奇怪:if ($1 ~ /RequestId/) -> 应该是 =~ (这些天我更习惯 perl 而不是 awk...)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-13
  • 1970-01-01
  • 1970-01-01
  • 2019-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多