いくつかの行に対してawkを実行する方法。

awkでいくつかの行を抽出したい。次のタスクを実行することは可能ですか:

ls -l | awk "BEGIN FOR(i=122;i<=129;i++) FNR==i" 

行番号122から129までの詳細を表示するにはどうすればよいですか?

コメント

  • これをループで行う場合は、' sedsedはawkよりもはるかに小さい(そして読み込みが速い)ため、div>メソッド。

回答

awkの仕組みを理解していません。指定された「プログラム」は、入力の各行(またはawk用語では「レコード」)に対して常に実行されます。FORまたは同様の構成。次を使用するだけです。

詳細な方法

ls -l | awk "NR>=122 && NR<=129 { print }" 

よりコンパクトな方法

ls -l | awk "NR==122,NR==129" 

これは、NRの範囲を示します。これは、「番号レコード」であり、通常はこれです。 awkが処理している現在の行です。

コメント

  • 実際には典型的なawkこのようなタスクのコードは通常ls -l | awk 'NR==122,NR==129'です。
  • awkを使用してファイルから最後の100行を取得するコマンドは何ですか
  • @ShihabudheenKMこれをご覧ください: stackoverflow.com/questions/12546919/ …

回答

もう1つの代替方法は、sedを使用することです。 :

ただし、質問が示唆しているように、これにawkを使用することが重要な場合は、Zrajmの回答に対するmanatworkのコメントを使用してください。 awkのドキュメントに記載されているとおり:

 A pattern may consist of two patterns separated by a comma; in this case, the action is performed for all lines from an occurrence of the first pattern though an occurrence of the second. 

したがって、必要に応じて、より高度な条件を作成することもできます。例:

ls -l | awk "NR==122,/foobar/" 

これにより、行122から出力が開始され、行に「foobar」という言葉。

実際のユースケースを教えていただければ、より良い解決策を提供する回答をお手伝いできるかもしれません。これは次のように聞こえるのではないかと心配しています。 XYの問題

回答

別の方法これを行うには(私はawkメソッドを好みますが)coreutilsを使用します:

ls -l | tail -n +122 | head -n 8 

回答

 awk "NR == 122,NR == 129{print $0}" file 

ここで、ファイルの122から129までの行を抽出できます。

$0は、ファイルデータ全体を122〜129行で出力するために使用されます。

コメント

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です