grepまたはawkを使用して、最初の文字に基づいて特定の行を無視しながら、各行の文字数をどのように計算できますか?

grepまたはawkを使用して、最初の文字に基づいて特定の行を無視しながら、各行の文字数をどのように計算できますか?

とても簡単です。ファイルには次のテキストがあります。

#number
3222
#number
3311

私は以下を使用しています:

awk '{印刷長}' file.txt

次のように印刷されます。

7

4

7

4

しかし、私は数字の長さを印刷し、「#」で始まる行を無視して印刷したいと思います。

4

4

答え1

awk最初の文字に次の行の長さだけを印刷するように指示します#

awk '!/^#/ { print length }' file

!/^#/ブロックの前に正規表現一致テストがあります。パターンが^#一致すると、次の関連付けブロックは次のようになります。いいえ(一致の意味が変わるので!)考慮されます。

このパターンは、現在の行の先頭でaを^#一致させようとします。#

または、数字のみを含む行の長さを出力したい場合:

awk '/^[[:digit:]]+$/ { print length }' file

始まりと終わりにアンカーがあるため、このパターンは^[[:digit:]]+$1つの連続した数字で構成される行にのみ一致します。数字以外の文字を含む行を避けるためにも使用できます。^$!/[^[:digit:]]/

またはすぐに次の行の長さだけを出力します#number

awk '$0 == "#number" { getline; print length }' file

ここでは、現在の行と文字列の比較を行います。正確に #number(質問のサンプルデータに示すように)次の行を読み、getlineその長さを出力します。

関連情報