列に存在しない値の数を見つける方法

列に存在しない値の数を見つける方法

列内に存在しない値、つまり「.」だけがある値がいくつあるかを調べる方法を見つけようとしています。

例えば

車.txt

Car           Colour      mpg          Year
vw_golf         blue       56          2006
vw_polo          red       66          2010
honda_civic    white       .           2007
ford_ka          red       .           2014

私が興味を持っているのはホンダ シビックとフォード KA です。これらの車には mpg 列に数字がないので、mpg 列に値がない値がいくつあるか (この場合は 2) を知りたいのです。

私が抱えている問題は、awk コマンドを使用するときにピリオドによってエラーが発生するように見えることです。

答え1

短いgrepアプローチ:

grep -Ec '^\S+\s+\S+\s+\.\s+' file
2

  • -E- 拡張正規表現を許可する
  • -c- 一致する行の数を出力します
  • \S+- 空白以外の文字に一致します。これは、[^[:space:]]
  • \s+- 空白文字にマッチします。これは、[[:space:]]

答え2

grepファイルが厳密にフォーマットされていて、mpg が列 28 から始まる場合の別の方法:

$ grep '...........................\.' input
honda_civic    white       .           2007
ford_ka          red       .           2014

$ grep -c '...........................\.' input
2

これは、28 個のピリオド (「任意の」文字) の後にエスケープされたピリオド (「ピリオド」) が続きます。

またはawkとして 言及されたコメント欄:

$ awk '$3 == "."' input
honda_civic    white       .           2007
ford_ka          red       .           2014

$ awk '$3 == "."' input | wc -l
2

関連情報