awkコマンドをファイルに入れる

awkコマンドをファイルに入れる

次の呼び出しがありますが、コマンドをファイルにbash保存したいと思います。私がやりたいことは、特定の関数がlineで始まりfunctionで終わることです。その後、関数から呼び出すことができます。awkawk$0 ~ beg_ere {display { sub(pn_ere, "") ; print }awkbash

  awk -v ukeys="$keyw" -v beg_ere="$beg_ere" -v pn_ere="$pn_ere" -v end_ere="$end_ere" \
    'function praggr (aggr) {
       resultstr = ""
       for (k in aggr) resultstr = (resultstr " | " aggr[k])
       return resultstr
     }
     $0 ~ beg_ere {
       title=gensub(beg_ere, "\\2", 1, $0);
       subtitle=gensub(beg_ere, "\\3", 1, $0);
       keywords=gensub(beg_ere, "\\4", 1, $0);

       nu = split(ukeys, uaggr, ",");
       nk = split(keywords, kaggr, ",");

       display=0;
       if ( nu > 0 && nk > 0)
        {
         for (i in uaggr)
          {
            umatch=0;
            for (j in kaggr)
             {
               if (uaggr[i] == kaggr[j]) { umatch=1; break; }
             }
             if (umatch == 1) { display=1; }
          }
        }

       else if ( nu > 0 && nk == 0 )
        {
          display=0;
        }

       else if ( nu == 0 )
        {
          display=1;
        }

       if (verbiage)
        {
          print "Title: " title;
          print "Subtitle: " subtitle;
          print "Keywords: " keywords;
          print "uaggr: " praggr(uaggr);
          print "kaggr: " praggr(kaggr);
          print "nu:" nu;
          print "nk:" nk;
        }
       next
     }
     $0 ~ end_ere { display=0 ; print "" }
     display { sub(pn_ere, "") ; print }
    ' "$filename"

答え1

.awkたとえば、拡張子を持つ新しいファイルを作成し、script.awkawk式をファイルに貼り付けます。その後、コマンドでファイルを参照できます。

awk -v ukeys="$keyw" -v beg_ere="$beg_ere" -v pn_ere="$pn_ere" -v end_ere="$end_ere" -f script.awk "$filename"

答え2

awk -fandの両方を指定することは不可能だと思いますawk '{code...}'

GNU awk(別名gawk)では、オプションを使用して複数のコードを同時に読み取ることができます-egawk --help詳しくは参考資料をご覧ください。使用方法を読むことも役に立ちますAWKPATHman gawk関連する読書を参照)。

この状況でGNU awkを使用したくない場合は、コマンドに複数を指定する必要があります-fawk

そして2つのファイルを使用しないでくださいあなたはそれを使用することができますプロセスの交換 <(command)。たとえば、<(echo code ...)-fを使用して関数を定義し、awk次のようにファイル内に別のコードを定義できます。

test.awk:

{ // I'm not sure if the `{` and  `}` should be here or they're not necessary at all
 $0 ~ beg_ere {
       title=gensub(beg_ere, "\\2", 1, $0);
       subtitle=gensub(beg_ere, "\\3", 1, $0);
       keywords=gensub(beg_ere, "\\4", 1, $0);

       nu = split(ukeys, uaggr, ",");
       nk = split(keywords, kaggr, ",");

       display=0;
       if ( nu > 0 && nk > 0)
        {
         for (i in uaggr)
          {
            umatch=0;
            for (j in kaggr)
             {
               if (uaggr[i] == kaggr[j]) { umatch=1; break; }
             }
             if (umatch == 1) { display=1; }
          }
        }

       else if ( nu > 0 && nk == 0 )
        {
          display=0;
        }

       else if ( nu == 0 )
        {
          display=1;
        }

       if ()
        {
          print "Title: " title;
          print "Subtitle: " subtitle;
          print "Keywords: " keywords;
          print "uaggr: " praggr(uaggr);
          print "kaggr: " praggr(kaggr);
          print "nu:" nu;
          print "nk:" nk;
        }
       next
     }
     $0 ~ end_ere { display=0 ; print "" }
     display { sub(pn_ere, "") ; print }
}

プロセス置換を使用すると、次のものを使用できます。

<(echo 'function praggr (aggr) {
       resultstr = ""
       for (k in aggr) resultstr = (resultstr " | " aggr[k])
       return resultstr
     }
')

または、単一引用符の問題を回避するには、'次のものを使用できますcat << EOF

<(cat <<'EOF' 
function praggr (aggr) {
  resultstr = ""
  for (k in aggr) resultstr = (resultstr " | " aggr[k])
    return resultstr
}
EOF
)

最後に、awkコマンドは次のようになります。

awk -v yourvars... -f <(echo 'function praggr (aggr) {
       resultstr = ""
       for (k in aggr) resultstr = (resultstr " | " aggr[k])
       return resultstr
     }
') -f test.awk "$filename"

関連情報