1

我有这个代码,但它给了我一个错误

awk '
    FNR == NR {
     # reading get_ids_only.txt
     values[$1] = ""
     next
    }
BEGIN {
  # reading default.txt
  for (elem in values){
    if ($0 ~ elem){
      if (values[elem] == ""){
        values[elem] = "\"" $0 "\""
        getline;  
        values[elem] = "\n"" $0 ""\n"
        }
      else{
        values[elem] = values[elem] ", \"" $0 "\""
         getline; 
         values[elem] = values[elem] "\n"" $0 ""\n"
         }
    }
 }
END {
  for (elem in values)
    print elem " [" values[elem] "]"
    }
' get_ids_only.txt default.txt

错误说

awk: syntax error at source line 23
 context is
    >>>  END <<<  {
awk: illegal statement at source line 24
awk: illegal statement at source line 24
    missing }

这是我的 END{ } 函数开始的地方......

我想做的是..比较文件1中的字符串..如果在文件2中找到字符串,打印字符串并打印它后面的行。然后跳过一个空格。

输入1:

 message id "hello"
 message id "good bye"
 message id "what is cookin"

输入2:

 message id "hello"
 message value "greetings"

 message id "good bye"
 message value "limiting"

 message id "what is there"
 message value "looking for me"

 message id "what is cooking"
 message value "breakfast plate"

输出:

 should print out all the input1, grabbing the message value from input 2.

谁能指导我为什么会发生此错误?

我在我的mac上使用终端。

4

1 回答 1

1

这是BEGIN带有推荐缩进和注释的块,你能看到问题吗?

BEGIN {
  # reading default.txt
  for (elem in values){
    if ($0 ~ elem){
      if (values[elem] == ""){
        values[elem] = "\"" $0 "\""
        getline;  
        values[elem] = "\n"" $0 ""\n"
      }
      else{
        values[elem] = values[elem] ", \"" $0 "\""
        getline; 
        values[elem] = values[elem] "\n"" $0 ""\n"
      } # End inner if
    } # End outer if
  } # End for loop

你缺少一个右括号。请注意,在与 , 的最终连接中$0$0实际上是引用了。

这还有其他一些问题,我不确定您要做什么,但这似乎是一种非常奇怪的方法。通常,如果您发现自己过度使用getline,您应该考虑将代码分散到具有适当条件的单独块中。有关更多信息的误用,请参阅这篇文章getline

一个更奇怪的方法来解决它

如果我理解正确,这就是我解决此任务的方式:

提取.awk

FNR==NR  { id[$0]; next }  # Collect id lines in the `id' array
$0 in id { f=1 }           # Use the `f' as a printing flag 
f                          # Print when `f' is 1
NF==0    { f=0 }           # Stop printing after an empty line

像这样运行它:

awk -f extract.awk input1 input2

输出:

message id "hello"
message value "greetings"

message id "good bye"
message value "limiting"
于 2013-03-12T07:13:01.010 回答