次の呼び出しがありますが、コマンドをファイルにbash
保存したいと思います。私がやりたいことは、特定の関数がlineで始まりfunctionで終わることです。その後、関数から呼び出すことができます。awk
awk
$0 ~ beg_ere {
display { sub(pn_ere, "") ; print }
awk
bash
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.awk
awk式をファイルに貼り付けます。その後、コマンドでファイルを参照できます。
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 -f
andの両方を指定することは不可能だと思いますawk '{code...}'
GNU awk(別名gawk
)では、オプションを使用して複数のコードを同時に読み取ることができます-e
。gawk --help
詳しくは参考資料をご覧ください。使用方法を読むことも役に立ちますAWKPATH
(man gawk
関連する読書を参照)。
この状況でGNU awkを使用したくない場合は、コマンドに複数を指定する必要があります-f
。awk
そして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"