AWKファイルに範囲を挿入する

AWKファイルに範囲を挿入する

CLIに渡されると、AWK範囲の多数の例が見つかりました。たとえば、

awk '/start/,/end/' file

AWKファイルに範囲を含める方法は?

#!/usr/bin/awk -f

BEGIN{
}
{
   # how do I express those "start" and "end" ranges?
}
END {
}

私のテキストファイルは次のとおりです。

...
don't care
don't care
start
record of interest
record on interest
...
end
don't care
don't care
...

答え1

awkスクリプトの本文には次の形式があります。

*pattern* *action*

これらのうちの1つは省略できます。省略模様平均行動常に実行されます。省略行動デフォルトでは、現在の行が印刷されます。

範囲を表現する自然な方法は次のとおりです。模様部分は次のとおりです。

BEGIN {
  somevar=5
}

/start/,/end/ { print }

END {
  somevar=6
}

(開始時と同じ構造を維持するために、BEGINおよびENDセクションをそのままにしています。)

〜にある行動場所を追跡するために必要なものは次のとおりです。

BEGIN {
  p=0
}

{
  if (/start/) p=1
  if (p) { print }
  if (/end/) p=0
}

END {
  p=0
}

ここではない模様だから、行動ブロックは各行に対して実行されます。 /に一致する行が表示されたら、pフラグ()を1または「true」に設定します。/startフラグがtrueの場合にのみその行を印刷します。 /が表示された場合、/endフラグはリセットされます。 BEGINとENDブロックは重複しており、awkのデフォルト値は0 / falseです。

答え2

oot@localhost ~]# i=`awk '/care/{print NR}' l.txt| sort -nr| sed -n '1p'`
[root@localhost ~]# awk -v i="$i"  '/care/{x=NR+i}(NR<=x){print }' l.txt
don't care
don't care
start
record of interest
record on interest
...
end
don't care
don't care
...

関連情報