2016-04-25 11 views
2

テーブル大文字小文字の区別なく出現を数える方法は?

chr10 10482 10484 0 11 + CA 
chr10 10486 10488 0 12 + ca 
chr10 10487 10489 0 13 + Ca 
chr10 10490 10492 0 13 + cA 
chr10 10491 10493 0 12 + CT 
chr10 10494 10496 6.66667 15 + ca 
chr10 10495 10497 6.66667 15 + cc 

Iは「CA」は関係なく、大文字または小文字にされている2つの文字の任意の見出すことができる列7の行数をカウントしたいです。

所望の出力が5

2つのコマンドは(下記)は、以下のコマンドは1

awk 'BEGIN {IGNORECASE = 1} END {if ($7=="CA"){++count} {print count}}' table 

注の値を返す

cat table | awk ' $7 ==/^[Cc][Aa]/{++count} END {print count}' 

awk 'BEGIN {IGNORECASE = 1} $7==/"CA"/ {++count} END {print count}' table 

空出力を与えるであろう。私実際のテーブルは何千万もの行になっているので、カウントするために中間テーブルとしてテーブルを作成したくありません。 (私は他のファイルに対してもこの作業を繰り返す必要があります)。

+1

IGNORECASEはGNU awk(gawk)の機能であり、他のawk実装では利用できません。 – ghoti

+0

また、 'grep -c -w -i 'ca $' table'は十分ではありませんか?あるいは、あなたのカウント以外にawkスクリプトに他の機能を組み込んでいますか? – ghoti

答えて

3

構文には少し問題があります。var == "string"またはvar ~ regexpと表示されますが、var ~ /"string"/と表示されています。正しい組み合わせを使用すると、コマンドの作業を行います

$ awk '$7 ~ /^[Cc][Aa]/{++count} END {print count+0}' file 
5 
$ awk 'BEGIN {IGNORECASE = 1} $7=="CA" {++count} END {print count+0}' file 
5 

また、あなたの代わりにIGNORECASEフラグを使用しての、これをチェックするtoupper()(またはtolower())を使用することもできます。

awk 'toupper($7) == "CA" {++count} END {print count+0}' file 

はにトリックに注意してください。 countの代わりにcount + 0を印刷してください。この方法では、以前に設定されていない変数を0にキャストします。一致するものがなければ、0と表示されます。 print countの場合は、空の文字列が返されます。

+0

awk 'BEGIN {IGNORECASE = 1} $ 7 == "CA" {++ count} END {印刷枚数}'ファイルの構文を使用しましたが、これは実際に働いています – user3146560

関連する問題