14

getlineは次の行を読み取り、NRカウンターを 1 増やします。 を使用した後、次の行から作業getlineawk再開します。これは、ほとんどの場合に望ましい動作です。

私の特別な状況では、次の行をのぞくだけでよく、その内容に応じて、次の行を読むか、1 行戻る必要があります。

で 1 行バックトラックするにはどうすればよいawkですか? NRカウンターを手動で設定しようとしましNR=NR-1たが、これは機能しません。または、変更せずに次の行だけを見る方法はありNRますか?

1行先読みが必要です。この場合、行を変数に保存して後で参照するだけでは機能しません。awkマスター ファイルに多くのサブファイルが含まれている可能性がある で、読み書きのできるプログラミング ツールを実装しようとしています。このようなサブファイルは、 のような行で始まります"% file:file1"。より低いインデントのある行または次のような行のある別の行に到達すると、そのようなファイルの終わりに"% file:file2"到達します。

/% file:/getline でこの行を既に読んでいる場合、一致するすべての行のルールセットは使用されません。NRそのため、前の行にリセットしてから、awk一致する行を再度読み取り/% file:/、適切なルールが実行されます。

4

2 に答える 2

1

これはちょっとしたハックで、かなりコストがかかりますが、小さなファイルの場合は先見の明が得られます。

cmd="sed -n " NR + 1 "p " FILENAME; cmd | getline nextline

これは NR の現在の値を取得し、sed を使用して入力ファイルから行 NR + 1 を抽出します。これは、先読みを行うたびに sed がファイル全体を読み取るため、コストがかかります (sed に「q」コマンドを追加することで、少し軽減できます)。変数 nextline はファイルの次の行に設定され、最終行では空白になります。

于 2012-04-19T17:01:27.273 に答える