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 に答える