タグ数を含むゲノムデータのファイルがあります。一度に何個が表現されているか知りたいです。
$ grep "^1" file |wc -l
1で始まるすべての行が含まれるため、10回、11回、100回、1245回などのタグが含まれます。これを行うにはどうすればよいですか?
Current format
79 TGCAG.....
1 TGCAG.....
1257 TGCAG.....
1 TGCAG......
次の行のみが必要です。
1 TGCAG.....
したがって、1257で始まる行を含めることはできません。注:上記のファイルはタブ区切りです。
awk
の場合:
awk '$1 == "1" { print; x++ } END { print x, "total matches" }' inputfile
1
で始まり、その後にスペースが続く行を選択します
grep -c '^1\s' file
grep -c '^1[[:space:]]' file
これは、行数も示します(wcを呼び出す必要はありません)。
1
notに続けて別の数値(または何もない):
grep -cE '^1([^0-9]|$)' file
しかし、上記の両方のソリューションにはいくつかの興味深い問題があります。読み続けてください。
質問の本文で、ユーザーはファイルが「タブ区切り」であると主張しています。
1
で始まり、その後にタブ(コマンドの実際のタブ)が続く行。区切り文字がスペース(またはその他、またはなし)の場合、これは失敗します。
grep '^1 ' file
1
で始まり、その後にスペース(コマンド内の実際のスペース)が続く行。区切り文字がそれ以外の場合、または何もない場合、これは失敗します。
grep '^1 ' file
grep '^1( | )' file
grep '^1[[:blank:]]' file
より柔軟なオプションは、いくつかのスペース(水平および垂直)文字を含めることです。 [:space:]
文字クラスセットは、(スペース)、\t
(水平タブ)、\r
(キャリッジリターン)、\n
(改行)、\v
で構成されています(垂直タブ)および\f
(フォームフィード)。ただし、grepは改行と一致しません(これは、-z
オプションでのみ回避できる内部制限です)。区切り文字の説明として使用できます。 GNU \s
の省略形を使用することも可能であり、短くなります:
grep -c '^1[[:space:]]` file
grep -c '^1\s' file
ただし、区切り文字がコロン:
またはその他の句読文字(または任意の文字)のようなものである場合、このオプションは失敗します。
または、数字から「数字ではない」境界への遷移を使用できます。実際には、「[_[:alnum:]]
(_a-zA-Z0-9
)にない文字」:
grep -c '^1\b' file # portable but not POSIX.
grep -c '^1\>' file # portable but not POSIX.
grep -wc '^1' file # portable but not POSIX.
grep -c '^1\W' file # portable but not POSIX (not match only a `1`) (not underscore in BSD).
これは、1で始まり、その後に句読点文字が続く有効な行として受け入れます。
あなたはこれが欲しいように聞こえます:
$ grep '^1\b' a
1 TGCAG.....
1 TGCAG......
このカウント部分について:
$ grep -c '^1\b' file
2
これらのどちらでも、1
最初の列
awk '$1 == 1'
grep -w '^1'
これらは両方とも拡張できるので、行を数えるためにwc
も必要ありません。
awk '$1==1 { x++ } END { print x }'
grep -cw '^1'
grep
の使用:
grep -c '^1\s' file
これは、1で始まり直後に空白が続くすべての行に一致し、それらの行の数を提供します(wc -l
の必要性を排除します)
$ cat input
79 TGCAG.....
1 TGCAG.....
1257 TGCAG.....
1 TGCAG......
$ grep -Ec '^1\s' input
2
ここでは良い答えですが、すべての行がスペースで終わっているわけではないと仮定すると(実際に「=」になる行がある場合など)、これを使用できます。
grep -c "^1[^0-9]" file
基本的に、1で始まり、その後に空白を含む非数字が続くすべての行に一致します。もう少し冗長ですが、より簡単です。 (ジャストワン・オン・ザ・ラインのヌル条件にはここでは何もないことに注意する価値はありますが、それは行末センシティブではありません。)
以下の行も使用できます:
$ awk -F' ' '{if($1=="1") print $0}' <your file name> | wc -l
パラメータ-F
はフィールドセパレータを空白にします。最初のフィールドの値が「1」の場合、その行が印刷されます。