
列内に存在しない値、つまり「.」だけがある値がいくつあるかを調べる方法を見つけようとしています。
例えば
車.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 '$3 == "."' input
honda_civic white . 2007
ford_ka red . 2014
$ awk '$3 == "."' input | wc -l
2