web-dev-qa-db-ja.com

1で始まるGrep行、ただし10、11、100などではない

タグ数を含むゲノムデータのファイルがあります。一度に何個が表現されているか知りたいです。

$ grep "^1" file |wc -l

1で始まるすべての行が含まれるため、10回、11回、100回、1245回などのタグが含まれます。これを行うにはどうすればよいですか?

Current format
79      TGCAG.....
1       TGCAG.....
1257    TGCAG.....
1       TGCAG......

次の行のみが必要です。

1       TGCAG.....

したがって、1257で始まる行を含めることはできません。注:上記のファイルはタブ区切りです。

11
mah

awkの場合:

awk '$1 == "1" { print; x++ } END { print x, "total matches" }' inputfile
16
DopeGhoti

体内の質問

1で始まり、その後にスペースが続く行を選択します

grep -c '^1\s'          file
grep -c '^1[[:space:]]' file

これは、行数も示します(wcを呼び出す必要はありません)。

タイトルの質問

1notに続けて別の数値(または何もない):

grep -cE '^1([^0-9]|$)' file 

しかし、上記の両方のソリューションにはいくつかの興味深い問題があります。読み続けてください。


質問の本文で、ユーザーはファイルが「タブ区切り」であると主張しています。

デリミタ

タブ

1で始まり、その後にタブ(コマンドの実際のタブ)が続く行。区切り文字がスペース(またはその他、またはなし)の場合、これは失敗します。

grep '^1    ' file

space

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で始まり、その後に句読点文字が続く有効な行として受け入れます。

27
Isaac

あなたはこれが欲しいように聞こえます:

$ grep '^1\b' a
1        TGCAG.....
1        TGCAG......

このカウント部分について:

$ grep -c '^1\b' file
2
18
slm

これらのどちらでも、1最初の列

awk '$1 == 1'
grep -w '^1'

これらは両方とも拡張できるので、行を数えるためにwcも必要ありません。

awk '$1==1 { x++ } END { print x }'
grep -cw '^1'
14
roaima

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
5
jesse_b

ここでは良い答えですが、すべての行がスペースで終わっているわけではないと仮定すると(実際に「=」になる行がある場合など)、これを使用できます。

 grep -c "^1[^0-9]" file

基本的に、1で始まり、その後に空白を含む非数字が続くすべての行に一致します。もう少し冗長ですが、より簡単です。 (ジャストワン・オン・ザ・ラインのヌル条件にはここでは何もないことに注意する価値はありますが、それは行末センシティブではありません。)

以下の行も使用できます:

$ awk -F' ' '{if($1=="1") print $0}' <your file name> | wc -l

パラメータ-Fはフィールドセパレータを空白にします。最初のフィールドの値が「1」の場合、その行が印刷されます。

0
Hossein Ojani